4 个版本
0.1.3 | 2022 年 7 月 6 日 |
---|---|
0.1.2 | 2022 年 6 月 27 日 |
0.1.1 | 2022 年 5 月 31 日 |
0.1.0-bate.1 | 2022 年 4 月 6 日 |
#2366 在 数据库接口
29KB
560 代码行
根据数据库中表结构生成文档或代码的工具
目前只支持 MySQL,预期将支持 sqlx 支持的所有数据库。
安装
cargo install --path .
执行生成命令
db-to-code d2c_config.toml
配置说明 d2c_config.toml
# 数据库连接
db_url="mysql://user:[email protected]/db_name"
# 需要构建表过滤规则
tables="^y_"
# 或指定需要构建的表
# tables=[
# "yaf_users"
# ]
# 输出文件模板
# 可用变量
# 表名 {table.table_name} 模型名 {table.model_name} 是否复合主键 {table.multi_pk}
# 表字段名 {field_data[].field_name} 显示字段名 {field_data[].column_name}
# 是否是主键 {field_data[].is_pk} 是否NULL {field_data[].is_null}
# 字段类型 {field_data[].type_name} 通过以下 type_map 映射后的值
# 字段默认值 {field_data[].default} 通过以下 default_map 映射后的值
# 字段注释 {field_data[].comment} 可通过 {field_data[].comment|rmln} 显示为单行
tpl_body="""
#[derive(sqlx::FromRow,sqlx_model::SqlxModel,Clone,Debug)]
#[sqlx_model(table_name="{table.table_name}")]
pub struct {table.model_name}Model \\{ {{ for field in field_data }}
{{ if field.comment }}/// {field.comment|rmln} {{ if field.default}} default: {field.default} {{ endif }}{{ endif }}
#[sqlx(default)]
#[sqlx(rename="{field.field_name}")]
pub {field.column_name}: {field.type_name},
{{ endfor }}}
"""
#{column_name}名转换规则: 参见规则列表
column_name_rule="lower_camel"
#{column_name}名前缀删除
column_name_start_replace=""
#{column_name}名后缀删除
column_name_end_replace=""
#{model_name}名转换规则: 参见规则列表
model_name_rule="camel"
#{model_name}名后缀删除
model_name_start_replace=""
#{model_name}名后缀删除
model_name_end_replace=""
#{table_name}名后缀删除
table_name_start_replace=""
#{table_name}名后缀删除
table_name_end_replace=""
# 是否每一个表合并成一个文件输出
outfile_merge=true
#文件存放名模板,为空时从标准输出,!!!注意!!!仅当 outfile_merge 为false时,才存在可用变量 {model_name} {table_name}
#outfile_name中{model_name}名转换规则: lower lower_camel kebab shouty_snake upper snake
#outfile_name="{model_name}Model.rs"
# 可用变量
# 通过 tpl_body 渲染得到的内容 {items[].render_data}
# 表字段名 {items[].table.table_name} 显示字段名 {items[].table.model_name}
# 字段数据,参考输出文件模板[tpl_body]的field_data变量 {items[].field_data.field_name ..等}
outfile_merge_tpl="""
use sqlx::FromRow;
use sqlx_model::SqlxModel;
{{ for item in items }}
// model : {item.table.model_name} [ {{ for field in item.field_data }} {field.field_name} {{endfor}}] {{endfor}}
{{ for item in items }}
{item.render_data}
{{endfor}}
"""
outfile_name_rule="camel"
#outfile_name中{model_name}名后缀删除
outfile_name_start_replace=""
#outfile_name中{model_name}名后缀删除
outfile_name_end_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+\\)"]
[type_map.2]
"i8"=["tinyint\\(\\d+\\)","ENUM"]
[type_map.3]
"i16"=["smallint\\(\\d+\\)"]
[type_map.4]
"i64"=["bigint\\(\\d+\\)"]
[type_map.5]
"u32"=["int\\(\\d+\\)\\s+unsigned"]
[type_map.6]
"u8"=["tinyint\\(\\d+\\)\\s+unsigned"]
[type_map.7]
"u16"=["smallint\\(\\d+\\)\\s+unsigned"]
[type_map.8]
"u64"=["bigint\\(\\d+\\)\\s+unsigned"]
[type_map.9]
"f32"=["float"]
[type_map.10]
"f64"=["decimal"]
[type_map.11]
"f64"=["decimal","double"]
#匹配默认值并修改为指定格式
[default_map.1]#.1 为优先级.越大越优先
#正则表达式=转换输出结果
"^\\((-)?\\d+\\.\\d+\\)$"="$1"
[default_map.2]
"^\\((-)?\\d+\\)$"="$1"
[default_map.3]
"^\\(.*\\)$"="\"$1\""
[default_map.4]
"^\\s*$"="\"\""
名称转换规则列表 以下值用于 column_name_rule model_name_rule
lower 仅转为小写
upper 仅转为全部大写
snake 小写下划线
shouty_snake 大写下划线
shouty_kebab 大写中划线
kebab 中划线分割
upper_camel 转首字母大写
lower_camel 转驼峰
依赖项
~14–28MB
~429K SLoC