Swoole下 生成Mysql数据表结构的方法.

1. 前言

Swoole 下提供了协程化的Mysql连接池类, 我们可以很方便地使用它进行数据库操作. 然而, PDO的一个缺点是 无论你的数据库字段是什么类型的, 返回的结果总是 string. 这无论是对于前端还是后端开发人员来说,在后续数据处理中会造成诸多不便, 解决思路是, 在程序启动的时候扫描数据库连接和数据表结构, 并生成对应的字段类型映射关系.

2. 建立默认字段映射关系

解决思路是:

  1. 扫描表结构和字段类型.
  2. 生成 字段名=>php类型映射表.
  3. 在得到查询结果后自动根据类型映射表转换类型

3. 用到的SQL

1
2
3
4
5
# $table_names  逗号分隔的表名
# $dbname 数据库名

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT FROM
`information_schema`.`COLUMNS` where `TABLE_SCHEMA` = '{$dbname}' AND `TABLE_NAME` IN ({$pads}) ORDER BY TABLE_NAME ASC", $table_names);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$types_map = [
//数值类
'tinyint'=>'integer',
'smallint'=>'integer',
'mediumint'=>'integer',
'int'=>'integer',
'integer'=>'integer',
'bigint'=>'integer',
'bit'=>'boolean',
//浮点类
'float'=>'double',
'double'=>'double',
'decimal'=>'double',

//数据类 文本和二进制
'char'=>'string',
'varchar'=>'string',

//当二进制处理
'binary'=>'binary',
'varbinary'=>'binary',
'tinyblob'=>'binary',
'blob'=>'binary',
'mediumblob'=>'binary',
'longblob'=>'binary',

'tinytext'=>'string',
'text'=>'string',
'mediumtext'=>'string',
'longtext'=>'string',

'enum'=>'string',
'set'=>'string',

'date'=>'string',
'time'=>'string',
'year'=>'string',
'datetime'=>'string',
'timestamp'=>'string'
];

4. 处理方法

1
2
3
4
5
6
7
8
9
10
# 获取特殊字段类型定义. 比如 json, bool 等.
$tables = Config::get("tables.{$dbname}.structs");

# 遍历类型表, 优先使用特殊字段类型映射,
foreach($records as $item){
$tbname = $item['TABLE_NAME'];
$colname = $item['COLUMN_NAME'];

$result[ $dbname ][$tbname][$colname] = $tables[$tbname][$colname] ?? $types_map[ $item['DATA_TYPE'] ];
}

5. 结束语

  1. 初始化表结构等代码最好在服务器启动最先执行.
  2. 代码中使用到了 Config 类, 是我的应用框架中读取和保存配置用的.

Swoole下 生成Mysql数据表结构的方法.

https://doc.exti.cc/2021/11/29/swoole-mysql-db/

作者

bywayboy

发布于

2021-11-29

更新于

2021-12-04

许可协议