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 次下载
24KB
344 行
naphtha
这个crate目前正在进行中。请访问docs.rs 文档页面以获取更多信息。
lib.rs
:
此库提供了几个特质,以使数据库访问变得更容易。此外,当使用 naphtha
时,您可以在不更改任何代码的情况下更改特定模型所使用的数据库。
它为您实现了数据库中最常见的操作,如 insert
、update
和 remove
,同时提供向数据库发送自定义查询的能力。此外,当使用 barrel-XXX
功能时,您可以在应用程序运行时编写SQL迁移并在其中使用它们。请参阅下面的示例。
功能概述
- 为您的模型提供最常用的函数实现
insert
、update
、remove
。 - 由
custom
函数提供的自定义事务 - DatabaseUpdateHandler 允许您在将模型的值更新到数据库的
update
事务之前和之后更改。 - 无需更改代码即可在您的应用程序中更改特定模型所使用的数据库。
- 使用其成员之一从数据库中查询模型的可能性。
- 集成 [barrel],用于编写SQL迁移,并在运行时应用它们。
- 线程安全地处理数据库连接。
支持数据库
示例
在本章中,展示了最小用法。请参阅仓库中的示例以获取更多和详细的用法。
连接到数据库
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