12 个版本 (4 个破坏性更新)
0.5.1 | 2023 年 6 月 27 日 |
---|---|
0.5.0 | 2023 年 6 月 27 日 |
0.4.0 | 2023 年 6 月 10 日 |
0.3.2 | 2023 年 5 月 1 日 |
0.1.2 | 2023 年 4 月 19 日 |
在 Web 编程 中排名 #1138
每月下载量 113 次
22KB
482 行代码(不包括注释)
PlanetScale Rust™ 无服务器驱动程序
Rust 的 database-js 版本。如 database-js 所述,它使用 PlanetScale HTTP API 进行数据库查询。它可以在 Cloudflare Workers 或 Vercel Edge Functions 上完美运行。
用法
cargo add planetscale-driver
# also "cargo add anyhow"
然后像示例中那样进行操作!
示例
连接和简单 SQL 执行
use planetscale_driver::PSConnection;
let conn = PSConnection::new(
"<host>",
"<user>",
"<password>",
);
let res = conn.execute("SELECT 1").await.unwrap();
fetch_one/fetch_all/fetch_scalar
如你所见,反序列化不使用字段名称(也许在未来会使用),因此请记住正确地编写你的结构体!
use planetscale_driver::{Database, query};
#[derive(Database, Debug)]
struct TestD {
val: u32
}
// ...
let res: TestD = query("SELECT 1").fetch_one(&conn).await?;
println!("{:?}", res);
let res: Vec<TestD> = query("SELECT val FROM testds").fetch_all(&conn).await?;
println!("{:?}", res);
let res: bool = query("SELECT true").fetch_scalar(&conn).await?;
println!("{:?}", res);
QueryBuilder
如果你想安全地将值绑定到查询中,你应该使用 QueryBuilder
注意:现在 query 方法是 QueryBuilder 的包装器
// ...
// note: values passed to .bind function must have trait ToString
let id = 69;
let name = "420";
// res there will be empty result, if you want to get reponse data use "execute_raw"
let res = query("INSERT INTO test(id, name) VALUES($0, \"$1\")")
.bind(id)
.bind(name)
.execute(&conn)
.await?;
Json
use planetscale_driver::{Database, DatabaseJSON, query};
#[derive(Database, Debug)]
pub struct TestD {
pub val: u32,
pub test: TestJSON,
}
#[derive(DatabaseJSON, serde::Deserialize, serde::Serialize, Debug)]
pub struct TestJSON {
pub text: String,
pub test: u32,
}
// ...
let json: TestJSON = TestJSON {
text: "test1234321".to_string(),
test: 1234,
};
let res: TestD = query("SELECT 1010, '$0'").bind(json).fetch_one(&conn).await?;
println!("{:?}", res);
事务
// ...
conn.transaction(|conn| async move {
conn.execute("QUERY")
.await?;
conn.execute("OTHER QUERY")
.await?;
// ^- use question mark to propagate errors "up"
// it's required if you want to rollback changes after error
Ok(())
}).await?;
特性
此 crate 使用 reqwest 来发送 HTTP 请求。默认情况下,此 crate 将使用 default-tls
功能的 reqwest
,这可能不会在你的环境中构建(例如 netlify 无服务器函数)。你可以通过禁用此 crate 的默认功能并启用不同的 reqwest tls 功能来覆盖此功能,如下所示
planetscale-driver = {version="0.5.0", default-features=false}
reqwest= {version= "0.11.17", default-features=false, features=["rustls-tls"]}
警告 如果你简单地禁用默认功能而不启用不同的 tls 功能,reqwest 将在运行时崩溃。
更多示例在 示例文件夹 中
如果你想运行它们
PS_HOST=<host> PS_USER=<username> PS_PASS=<pscale_password> cargo run --example <example_name>
依赖项
~5–19MB
~303K SLoC