根据数据库中表结构生成代码工具

目前只支持mysql,预期sqlx支持的数据库都会支持。

安装

shell cargo install --path .

执行生成命令

shell db-to-code d2c_config.toml

配置说明 d2c_config.toml

```toml

数据库连接

dburl="mysql://user:xxx@0.0.0.0/dbname"

需要构建表过滤规则

tables="^y_"

或指定需要构建的表

tables=[

"yaf_users"

]

输出文件模板

可用变量 表名 {table.tablename} 模型名 {table.modelname} 是否复合主键 {table.multi_pk}

表字段名 {fielddata[].fieldname} 显示字段名 {fielddata[].columnname}

是否是主键 {fielddata[].ispk} 是否NULL {fielddata[].isnull}

字段类型 {fielddata[].typename} 通过以下 type_map 映射后的值

字段默认值 {fielddata[].default} 通过以下 defaultmap 映射后的值

字段注释 {fielddata[].comment} 可通过 {fielddata[].comment|rmln} 显示为单行

tpl_body="""

[derive(sqlx::FromRow,sqlx_model::SqlxModel,Clone,Debug)]

[sqlx(tablename="{table.tablename}")]

pub struct {table.modelname} \{ {{ for field in fielddata }} {{ if field.comment }}/// {field.comment|rmln} {{ if field.default}} default: {field.default} {{ endif }}{{ endif }} #[sqlx(default)] #[sqlx(rename="{field.fieldname}")] pub {field.columnname}: {field.type_name}, {{ endfor }}} """

{columnname}名转换规则: 支持 lower camel mixed kebab shoutysnake upper snake

columnnamerule="mixed"

{column_name}名前缀删除

columnnamestart_replace=""

{column_name}名后缀删除

columnnameend_replace=""

{modelname}名转换规则: lower camel mixed kebab shoutysnake upper snake

modelnamerule="camel"

{model_name}名后缀删除

modelnamestart_replace=""

{model_name}名后缀删除

modelnameend_replace=""

是否每一个表拆分成一个文件输出,前提是outfile_name不为空

outfile_split=true

当 outfile_name 为空时从标准输出输出,默认为空

文件存放名模板

当 outfilesplit 为true时,可用变量 {modelname} {table_name}

outfilename="{modelname}Model.rs"

outfilename中{modelname}名转换规则: lower camel mixed kebab shouty_snake upper snake

outfilenamerule="camel"

outfilename中{modelname}名后缀删除

outfilenamestart_replace=""

outfilename中{modelname}名后缀删除

outfilenameend_replace=""

文件存在时是否覆盖

outfile_overwrite=true

默认NULL转换为指定类型

default_null="None"

未设置默认值转换为指定类型

default_none="None"

是否使用类型转换,默认:true

type_transform=true

默认字段类型,当type_map都不匹配时使用此类型

type_default="String"

字段类型转换映射

[type_map.1]#.1 为优先级.越大越优先

输出类型=[正则表达式,符合一个即使用]

"i32"=["int\(\d+\)"] [typemap.2] "i8"=["tinyint\(\d+\)","ENUM"] [typemap.3] "i16"=["smallint\(\d+\)"] [typemap.4] "i64"=["bigint\(\d+\)"] [typemap.5] "u8"=["tinyint\(\d+\)\s+unsigned"] [typemap.6] "u16"=["smallint\(\d+\)\s+unsigned"] [typemap.7] "u32"=["int\(\d+\)\s+unsigned"] [typemap.8] "u64"=["bigint\(\d+\)\s+unsigned"] [typemap.9] "f32"=["float"] [typemap.10] "f64"=["decimal"] [typemap.11] "f64"=["decimal","double"]

匹配默认值并修改为指定格式

[default_map.1]#.1 为优先级.越大越优先

正则表达式=转换输出结果

"^\((-)?\d+\.\d+\)$"="$1" [defaultmap.2] "^\((-)?\d+\)$"="$1" [defaultmap.3] "^\(.\)$"="\"$1\"" [default_map.4] "^\s$"="\"\"" ```