3个不稳定版本
0.1.1 | 2021年1月29日 |
---|---|
0.1.0 | 2021年1月29日 |
0.0.2 | 2020年1月13日 |
在#tokio-postgres中的排名:21
每月下载量:33
在2个crate中使用了(通过sql_db_mapper_core)
11KB
67 代码行
sql_db_mapper
一个用于生成Rust数据库映射的命令行工具。
连接到PostgreSQL数据库,并创建一个表示所有模式的Rust模块,包括存储函数/过程的映射
使用tokio-postgres
和postgres
将SQL表、视图和函数映射到Rust结构和函数
注意
一旦生成,生成的代码不包含额外的检查以确保数据库模式没有更改。虽然某些类型转换会在调用时失败,但仍应同时更新生成的代码和数据库
所有生成的函数都将数据库连接客户端作为第一个参数
重载的SQL过程/函数(具有相同名称和不同参数的两个函数)将被映射到只接受一个元组的函数,即my_func((client, id, "hello"))和my_func((client, id))
这意味着重载先前未重载的SQL过程将导致生成的代码发生破坏性更改(除非使用具有选项all或one的use-tuples)
帮助
sql_db_mapper 0.1.0
Generate a rust wrapper for a PostgreSQL database
USAGE:
sql_db_mapper [FLAGS] [OPTIONS] --conn <conn> [--] [output]
FLAGS:
-d, --debug Activate debug mode
--dir Program will treat output as a directory name rather than a file and generate a whole crate.
If output is not provided code is printed as usual
-h, --help Prints help information
--no-functions Only make mappings for tables and views
--rust-case Convert names from the database to rust standard (i.e. table names in CamelCase, fields and
functions in snake_case)
-u, --ugly Skip running output through rustfmt
-V, --version Prints version information
OPTIONS:
--conn <conn>
String to connect to database, see tokio_postgres::Config for details. If not provided environment variable
DATABASE_URL is checked instead
--rustfmt-config <rustfmt-config> string passed to rustfmt --config
--rustfmt-config-path <rustfmt-config-path> string passed to rustfmt --config-path
--third-party <third-party>...
A comma seperated list of third party crates which contain types that will be mapped to and from sql types.
Valid values are "bit_vec,chrono,eui48,geo_types,rust_decimal,serde_json,time,uuid"
--use-tuples <use-tuples>
How to use tuples (used by default for just overloads). Options: overloads (the default, use tuples to
represent function overloading). all (Have all functions take a tuple for consitency). none (skip mapping
overloaded procs at all). one_overload (avoid tuples by only mapping the oldest sql proc in the database)
[default: overloads]
ARGS:
<output> Output file, stdout if not present
常见错误
| 在模块`super::pg_catalog`中找不到类型`????`
指定的类型只能由第三方crate之一映射。`postgres_types::FromSql
列出了可以映射的所有类型,除了`Numeric`,它使用`rust_decimal::Decimal进行映射
sql_db_mapper_core
包含将tokio-postgres Rows转换为Rust类型的trait TryFromRow,并为几种常见类型实现了它
重新导出可转换为SQL类型的类型
sql_db_mapper_derive
具有从TryFromRow(在sql_db_mapper_core中定义)派生的宏
在build.rs
脚本中使用
创建一个新的库crate,并使Cargo.toml看起来如下
[package]
name = "rust_test"
version = "0.1.0"
edition = "2018"
[dependencies]
sql_db_mapper_core = { version = "0.1", features = ["with-bit-vec-0_6", "with-chrono-0_4", "with-eui48-0_4", "with-geo-types-0_6", "with-rust_decimal-1", "with-serde_json-1", "with-time-0_2", "with-uuid-0_8", ] }
postgres-types = { version = "0.2", features = ["derive"] }
async-trait = { version = "0.1", optional = true }
serde = { version = "1.0", features = ["derive"] }
[build-dependencies]
sql_db_mapper = { path = "../sql_db_mapper/sql_db_mapper" }
[features]
sync = []
async = ["async-trait"]
更改crate的名称和版本以及sql_db_mapper_core的特性能满足您的需求
创建一个包含以下内容的build.rs
文件
use sql_db_mapper::{ Opt, Tuples, ThirdParty };
fn main() {
let options = Opt {
debug: false,
ugly: false,
dir: false, // this should be false
rust_case: true,
rustfmt_config: None,
rustfmt_config_path: None,
no_functions: false,
use_tuples: Tuples::ForOverloads,
third_party: vec![
ThirdParty::Chrono,
ThirdParty::Time,
ThirdParty::Eui48,
ThirdParty::GeoTypes,
ThirdParty::SerdeJson,
ThirdParty::Uuid,
ThirdParty::BitVec,
ThirdParty::RustDecimal,
],
conn: std::env::var("DATABASE_URL").expect("Must provide connection string in environment variable 'DATABASE_URL'"),
output: Some("./src/lib.rs".into())
};
let mut client = options.get_client();
let full_db = client.get_all(options.no_functions);
full_db.make_output(&options);
}
这应该足以开始使用了。
可能未来的工作
- 更多与代码生成相关的选项
- 从
COMMENT ON
获取文本并将其放入文档注释中 - 允许函数(例如)接受&varchar,也可以接受&str(varchar是String的一个typedef,因此函数可能需要像HashMap的get一样泛型)
- 从
- 考虑添加对其他流行数据库的支持,或者Rust数据库库
- sqlx和diesel代码生成器将很有用
许可证
根据您的选择,许可协议为以下之一
- Apache许可证版本2.0(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则根据Apache-2.0许可证定义的您有意提交以包含在作品中的任何贡献,将按照上述方式双重许可,无需任何额外条款或条件。
依赖项
~1.5MB
~35K SLoC