{"id":22533579,"url":"https://github.com/shanliu/sqlx-model","last_synced_at":"2025-04-09T18:04:10.714Z","repository":{"id":43056558,"uuid":"426666168","full_name":"shanliu/sqlx-model","owner":"shanliu","description":"基于sqlx 轻量级orm实现","archived":false,"fork":false,"pushed_at":"2023-12-18T12:15:58.000Z","size":190,"stargazers_count":10,"open_issues_count":4,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-23T20:02:39.302Z","etag":null,"topics":["orm","rust","sql"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shanliu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-11-10T15:04:50.000Z","updated_at":"2024-10-23T13:20:47.000Z","dependencies_parsed_at":"2022-09-10T03:42:20.785Z","dependency_job_id":null,"html_url":"https://github.com/shanliu/sqlx-model","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shanliu%2Fsqlx-model","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shanliu%2Fsqlx-model/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shanliu%2Fsqlx-model/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shanliu%2Fsqlx-model/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shanliu","download_url":"https://codeload.github.com/shanliu/sqlx-model/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248084043,"owners_count":21045123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["orm","rust","sql"],"created_at":"2024-12-07T09:08:49.668Z","updated_at":"2025-04-09T18:04:10.686Z","avatar_url":"https://github.com/shanliu.png","language":"Rust","readme":"\u003cdiv align=\"center\"\u003e\n\u003ch3\u003e基于 sqlx 轻量级orm实现\u003c/h3\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://crates.io/crates/sqlx-model\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/v/sqlx-model.svg?style=flat-square\"\n    alt=\"Crates.io version\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://docs.rs/sqlx-model\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/docs-latest-blue.svg?style=flat-square\"\n      alt=\"docs.rs docs\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\n\u003e 注意:当前仅供学习或测试使用,后面版本会有比较大变动.\n\n##### 引入\n\n\u003e 使用 default-features = false 禁用默认使用的tokio,自行选择运行时跟数据库类型\n\n```toml\n[dependencies]\nsqlx-model = { version = \"~0.2.1\", path = \"../../\",default-features = false,features = [\"sqlx-mysql\"] }\nsqlx = {version = \"~0.6\",features = [ \"mysql\",\"offline\",\"runtime-async-std-native-tls\"] }\nasync-std={version = \"1.10.0\", features = [ \"attributes\" ]}\n```\n\n##### 常用增删改查示例\n\n使用前准备，结构体增加derive宏\n\u003e 使用 sqlx_model::SqlxModel 宏 自动增加辅助方法\n\u003e 同时会创建 UserModelRef 的结构，用于辅助增删改查操作\n\n\n##### 如果已有表结构,可以通过表结构生成对应的`rs`model文件,以下工具可用:\n\n\u003e https://crates.io/crates/sqlx-model-tools 具体使用方式参考[该create文档](./sqlx-model-tools)\n\n\n```rust\n#[derive(sqlx::FromRow,Clone,Debug)]\n#[sqlx_model(db_type=\"MySql\",table_pk=\"id\",table_name=\"users\")]\npub struct UserModel {\n    #[sqlx(default)]\n    pub id: u32,\n    #[sqlx(default)]\n    pub nickname: String,\n    #[sqlx(default)]\n    pub gender: u8,\n    #[sqlx(default)]\n    pub headimg: Option\u003cString\u003e,\n    #[sqlx(default)]\n    #[sqlx(rename=\"password_id\")]//自定义字段名\n    pub password_id: u32,\n}\n```\n\n1. 新增：\n\n\u003e 更多使用方法参考 tests 目录\n\n```rust\n    let nike_name=\"new insert\".to_string();\n    let gender=1;\n    let userinsert=sqlx_model::model_option_set!(UserModelRef,{\n        nickname:nike_name,\n        gender:gender,\n        //不需要全部字段赋值，没赋值生成SQL会少对应字段，等于用表中默认值\n    });\n    let i1=Insert::\u003csqlx::MySql,UserModel,_\u003e::new(userinsert).execute(\u0026db).await.unwrap();\n    assert!(i1.last_insert_id()\u003e0);\n```\n\n2. 删除：\n\n\u003e 更多使用方法参考 tests 目录\n\n```rust\n    let select=Select::type_new::\u003cUserModel\u003e();\n    let user=select.fetch_one_by_where::\u003cUserModel\u003e(\u0026WhereOption::Where(format!(\"id=1\")), \u0026db).await.unwrap();\n    let detete=Delete::\u003csqlx::MySql\u003e::new(UserModel::table_name())\n        .execute_by_pk(\u0026user, \u0026db)\n        .await.unwrap();\n    assert_eq!(detete.rows_affected(),1);\n```\n\n3. 修改：\n\n\u003e 更多使用方法参考 tests 目录\n\n```rust\n    let nike_name=\"change to 1\".to_string();\n    let userchange=sqlx_model::model_option_set!(UserModelRef,{\n    nickname:nike_name,\n    });\n    let update=Update::\u003csqlx::MySql,UserModel,_,_\u003e::new(userchange);\n    let update=update.execute_by_scalar_pk(1,\u0026db).await.unwrap();\n    assert_eq!(update.rows_affected(),1);\n```\n\n4. 查询：\n\n\u003e 更多使用方法参考 tests 目录\n\n```rust\n    let iid=1;\n    let select=Select::type_new::\u003cUserModel\u003e();\n    let user=select.fetch_one_by_scalar_pk::\u003cUserModel,_,_\u003e(iid, \u0026db).await.unwrap();\n    assert_eq!(user.id as u64,iid);\n```\n\n5. 事务:\n\n\u003e 更多使用方法参考 tests 目录\n\n```rust\n    let mut ta=db.begin().await.unwrap();\n    let nike_name=\"new tran\".to_string();\n    let userinsert=sqlx_model::model_option_set!(UserModelRef,{\n        nickname:nike_name,\n        gender:11,\n    });\n    Insert::\u003csqlx::MySql,UserModel,_\u003e::new(userinsert).execute(\u0026mut ta).await.unwrap();\n    //其他 查删改操作...\n    ta.commit().await.unwrap();\n```\n\n6. 事务跟Poll选择执行\n\n```rust \nfn my_exec(transaction:Option\u003c\u0026mut Transaction\u003c't,sqlx::MySql\u003e\u003e){\n    let pool=get_db_pool();\n    let res=executor_option!({\n        //  transaction 为 None 用 \u0026pool 代替 db 如果 [因为execute为泛型且为\u0026mut,多次时需要手动调用as_copy]\n        //  否则为 transaction 里的值代替 db\n        Insert::\u003csqlx::MySql, UserEmailModel, _\u003e::new(idata).execute(db.as_copy()).await?\n    },transaction,\u0026pool,db);\n}\n```\n\n7. 日期及其他自定义字段类型支持示例\n\n```rust\nuse chrono::{DateTime, Datelike, TimeZone, Timelike, Utc};\nuse sqlx::FromRow;\nuse sqlx_model::{SqlQuote, SqlxModel};\nuse std::ops::Deref;\n#[derive(sqlx::Type, Clone, Debug, PartialEq, Eq)]\n#[sqlx(transparent)]\npub struct MyTime\u003cTz: TimeZone\u003e(DateTime\u003cTz\u003e);\nimpl\u003cTz: TimeZone\u003e Deref for MyTime\u003cTz\u003e {\n    type Target = DateTime\u003cTz\u003e;\n    fn deref(\u0026self) -\u003e \u0026Self::Target {\n        \u0026self.0\n    }\n}\n //其他自定义结构需实现 SqlQuote\u003cT\u003e \n //其中 T 为sqlx支持类型[如String,i32,i64...等]\nimpl\u003cTz: TimeZone\u003e SqlQuote\u003cString\u003e for MyTime\u003cTz\u003e {\n    fn sql_quote(\u0026self) -\u003e String {\n        format!(\n            \"{}-{}-{} {}:{}:{}\",\n            self.0.year(),\n            self.0.month(),\n            self.0.day(),\n            self.0.hour(),\n            self.0.minute(),\n            self.0.second()\n        )\n    }\n}\n\n#[derive(FromRow, Clone, Debug, SqlxModel)]\npub struct UserModel {\n    #[sqlx(default)]\n    pub id: u64,\n    pub id1: MyTime\u003cUtc\u003e,\n}\n```\n\n##### 辅助SQL生成操作\n\n```rust\n     let data=[\"dd\",\"b'bb\"];\n     let password_id=Some(1);\n     let sql=sql_format!(\n            \"select * from yaf_users where id\u003e{id} {in_grade} and password_id {password_where} \",\n            id=1,\n            in_grade=sql_array_str!(\"and grade in ({})\",data),\n            password_where=sql_option_str!(\"= {}\",\"is {}\",password_id)\n        );\n     println!(\"{sql}\");//select * from yaf_users where id\u003e1 and grade in ('dd','b\\'bb') and password_id = 1\n    //会转义'防止sql注入\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshanliu%2Fsqlx-model","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshanliu%2Fsqlx-model","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshanliu%2Fsqlx-model/lists"}