8 个版本 (5 个重大更改)

0.5.0 2022年2月27日
0.4.1 2021年11月22日
0.3.1 2021年9月20日
0.2.0 2021年9月11日
0.0.0 2021年4月14日

#1802数据库接口

每月 25 次下载

MIT/Apache

24KB
344

naphtha

这个crate目前正在进行中。请访问docs.rs 文档页面以获取更多信息。


lib.rs:

此库提供了几个特质,以使数据库访问变得更容易。此外,当使用 naphtha 时,您可以在不更改任何代码的情况下更改特定模型所使用的数据库。

它为您实现了数据库中最常见的操作,如 insertupdateremove,同时提供向数据库发送自定义查询的能力。此外,当使用 barrel-XXX 功能时,您可以在应用程序运行时编写SQL迁移并在其中使用它们。请参阅下面的示例

功能概述

  • 为您的模型提供最常用的函数实现 insertupdateremove
  • custom 函数提供的自定义事务
  • DatabaseUpdateHandler 允许您在将模型的值更新到数据库的 update 事务之前和之后更改。
  • 无需更改代码即可在您的应用程序中更改特定模型所使用的数据库。
  • 使用其成员之一从数据库中查询模型的可能性。
  • 集成 [barrel],用于编写SQL迁移,并在运行时应用它们。
  • 线程安全地处理数据库连接。

支持数据库

  • SQLite3(底层使用 diesel)。
  • MySQL(底层使用 diesel)。
  • PostgreSQL(底层使用 diesel)。

示例

在本章中,展示了最小用法。请参阅仓库中的示例以获取更多和详细的用法。

连接到数据库

use naphtha::{DatabaseConnection, DatabaseConnect};
// This is the only line required to be changed to switch database types.
type DbBackend = diesel::SqliteConnection;
let db: DatabaseConnection<DbBackend> = DatabaseConnection::connect(":memory:").unwrap();
// do some database work

定义模型和使用数据库连接

要创建模型及其数据库集成,需要以下代码。

请注意,这只是一个摘录,请参阅存储库中的 examples 文件夹以获取完整的示例。

#[model(table_name = "persons")]
pub struct Person {
    id: i32,
    pub description: Option<String>,
    pub updated_at: NaiveDateTime,
}

pub mod schema {
    table! {
        persons (id) {
            id -> Int4,
            description -> Nullable<Varchar>,
            updated_at -> Timestamp,
        }
    }
}

impl DatabaseModel for Person {
    type PrimaryKey = i32;
    fn primary_key(&self) -> Self::PrimaryKey {
        self.id
    }

    fn set_primary_key(&mut self, value: &Self::PrimaryKey) {
        self.id = *value;
    }

    fn default_primary_key() -> Self::PrimaryKey {
        0
    }

    fn table_name() -> &'static str {
        "persons"
    }
}

// Define your custom changes to the model before and after the transactions.
impl<T> naphtha::DatabaseUpdateHandler<T> for Person {}
impl<T> naphtha::DatabaseRemoveHandler<T> for Person {}
impl<T> naphtha::DatabaseInsertHandler<T> for Person {}

// This implements your database migration functions.
impl DatabaseSqlMigration for Person {
    fn migration_up(migration: &mut Migration) {
        use naphtha::DatabaseModel;
        migration.create_table_if_not_exists(Self::table_name(), |t| {
            t.add_column("id", types::primary());
            t.add_column("description", types::text().nullable(true));
            t.add_column("updated_at", types::custom("timestamp"));
        });
    }

    fn migration_down(migration: &mut Migration) {
        use naphtha::DatabaseModel;
        migration.drop_table_if_exists(Self::table_name());
    }
}

fn main() {
    use naphtha::{DatabaseConnection, DatabaseConnect};
    let db = DatabaseConnection::connect(":memory:").unwrap();
    // p is to be mutable because the insert function updates the id member
    // to the one given by the database.
    let mut p = Person {
        id: Person::default_primary_key(),
        description: Some("The new person is registered".into()),
    };
    p.insert(&db);
    // id member is set to the correct number given by the database.

    // do a custom query to the database
    db.custom::<diesel::result::QueryResult::<Person>, _>(|c: &DbBackend| {
        use schema::{persons, persons::dsl::*};
        persons.filter(id.eq(1)).first(c)
    });

    p.remove(&db);
    // p not available anymore in the database
}

依赖项

~4–8.5MB
~171K SLoC