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

Download history 12/week @ 2024-03-11 10/week @ 2024-04-01

每月下载量 113

MIT 许可证

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