Skip to main content

sqlxplus/
database_type.rs

1/// 数据库类型提取 trait
2///
3/// 用于从 Pool 或 Transaction 中自动推断数据库类型
4/// 这样用户就不需要显式指定 `find_by_id::<sqlx::MySql, _>`,而是可以直接调用 `find_by_id_auto(pool, id)`
5pub trait DatabaseType {
6    /// 关联的数据库类型
7    type DB: sqlx::Database + crate::database_info::DatabaseInfo;
8}
9
10// 为 Pool 实现 DatabaseType
11#[cfg(feature = "mysql")]
12impl DatabaseType for sqlx::Pool<sqlx::MySql> {
13    type DB = sqlx::MySql;
14}
15
16#[cfg(feature = "postgres")]
17impl DatabaseType for sqlx::Pool<sqlx::Postgres> {
18    type DB = sqlx::Postgres;
19}
20
21#[cfg(feature = "sqlite")]
22impl DatabaseType for sqlx::Pool<sqlx::Sqlite> {
23    type DB = sqlx::Sqlite;
24}
25
26// 为 &Pool 实现 DatabaseType
27#[cfg(feature = "mysql")]
28impl DatabaseType for &sqlx::Pool<sqlx::MySql> {
29    type DB = sqlx::MySql;
30}
31
32#[cfg(feature = "postgres")]
33impl DatabaseType for &sqlx::Pool<sqlx::Postgres> {
34    type DB = sqlx::Postgres;
35}
36
37#[cfg(feature = "sqlite")]
38impl DatabaseType for &sqlx::Pool<sqlx::Sqlite> {
39    type DB = sqlx::Sqlite;
40}
41
42// 为 Transaction 实现 DatabaseType
43#[cfg(feature = "mysql")]
44impl<'tx> DatabaseType for &mut sqlx::Transaction<'tx, sqlx::MySql> {
45    type DB = sqlx::MySql;
46}
47
48#[cfg(feature = "postgres")]
49impl<'tx> DatabaseType for &mut sqlx::Transaction<'tx, sqlx::Postgres> {
50    type DB = sqlx::Postgres;
51}
52
53#[cfg(feature = "sqlite")]
54impl<'tx> DatabaseType for &mut sqlx::Transaction<'tx, sqlx::Sqlite> {
55    type DB = sqlx::Sqlite;
56}
57
58// 为 Connection 类型实现 DatabaseType(as_mysql_executor 等返回的是 Connection)
59#[cfg(feature = "mysql")]
60impl DatabaseType for sqlx::MySqlConnection {
61    type DB = sqlx::MySql;
62}
63
64#[cfg(feature = "mysql")]
65impl DatabaseType for &mut sqlx::MySqlConnection {
66    type DB = sqlx::MySql;
67}
68
69#[cfg(feature = "postgres")]
70impl DatabaseType for sqlx::PgConnection {
71    type DB = sqlx::Postgres;
72}
73
74#[cfg(feature = "postgres")]
75impl DatabaseType for &mut sqlx::PgConnection {
76    type DB = sqlx::Postgres;
77}
78
79#[cfg(feature = "sqlite")]
80impl DatabaseType for sqlx::SqliteConnection {
81    type DB = sqlx::Sqlite;
82}
83
84#[cfg(feature = "sqlite")]
85impl DatabaseType for &mut sqlx::SqliteConnection {
86    type DB = sqlx::Sqlite;
87}