14 个版本 (重大更改)
0.11.0 | 2023 年 9 月 19 日 |
---|---|
0.10.0 | 2023 年 7 月 20 日 |
0.9.0 | 2023 年 4 月 12 日 |
0.8.1 | 2022 年 11 月 23 日 |
0.2.0 | 2021 年 10 月 24 日 |
在 数据库接口 中排名第 2192
每月下载量 86
41KB
838 行
WasmCloud SQL 数据库接口
本接口定义了一个基本的 SQL 数据库提供者,具有 wasmcloud:sqldb
能力合约。
本接口的初始版本(0.1)支持执行 SQL 查询(插入、更新、创建表等)和获取数据(选择)。
API 旨在独立于任何特定的关系数据库实现(PostgreSQL、MySQL、MariaDB、SQLite 等)。
为了效率,查询结果以紧凑的二进制对象表示 CBOR 编码,这是一种语言中立格式。CBOR 设计为可扩展、语言中立,比 JSON 约密集 50-70%,适合受限环境(低 CPU 和内存需求)。解析器易于编写,并在 多种语言 中有库可用。
本接口为 预发布版本,可能有所更改。以下功能目前不受支持
- 可为空的字段
- 事务
- 预处理语句
- 流式结果
能力提供者实现
以下是 wasmcloud:sqldb
合约的实现列表。如果您有社区/开源版本,欢迎提交 PR 添加您的实现。
名称 | 供应商 | 描述 |
---|---|---|
sqldb-postgres | wasmCloud | 实现 sqldb 合同以与兼容 Postgres 的数据库接口(例如,也适用于具有 Postgres 后端的 Azure CosmosDB) |
示例用法
🦀 Rust
以下示例摘自 Todo-sql 示例演员。创建一个表来存储 TODO 列表的 DbTodo
对象
use wasmbus_rpc::actor::prelude::*;
use wasmcloud_interface_sqldb::{minicbor, SqlDb, SqlDbError, SqlDbSender};
use minicbor::{decode, Decode, Encode};
#[derive(Encode, Decode)]
struct DbTodo {
#[n(0)]
url: String,
#[n(1)]
title: String,
#[n(2)]
completed: bool,
#[n(3)]
priority: i32,
}
/// create an empty table with the proper schema
async fn create_table(ctx: &Context) -> Result<(), SqlDbError> {
let db = SqlDbSender::new();
let sql = format!(
r#"create table if not exists {} (
id varchar(36) not null,
url varchar(42) not null,
title varchar(100) not null,
priority int4 not null default 0,
completed bool not null default false
);"#,
TABLE_NAME
);
let _resp = db.execute(ctx, sql.into()).await?;
Ok(())
}
从数据库中检索 DbTodo
use wasmbus_rpc::actor::prelude::*;
use wasmcloud_interface_sqldb::{minicbor, SqlDb, SqlDbError, SqlDbSender};
use wasmcloud_interface_logging::info;
use minicbor::{decode, Decode, Encode};
async fn get_db_todo(ctx: &Context, url: &str) -> Result<DbTodo, SqlDbError> {
info!("Getting a todo...");
let db = SqlDbSender::new();
check_safety("url", url)?;
let resp = db
.fetch(
ctx,
&format!(
"select url, title, completed, priority from {} where url='{}'",
TABLE_NAME, url
),
)
.await?;
if resp.num_rows == 0 {
return Err(SqlDbError::new("notFound", "url not found".to_string()));
}
let mut rows: Vec<DbTodo> = decode(&resp.rows)?;
let db_todo = rows.remove(0);
Ok(db_todo)
}
🐭 Golang
创建一个表来存储 TODO 列表的 DbTodo
对象
import (
"github.com/wasmcloud/actor-tinygo"
sqldb "github.com/wasmcloud/interfaces/sqldb/tinygo"
)
var sql string = `
create table if not exists {} (
id varchar(36) not null,
url varchar(42) not null,
title varchar(100) not null,
priority int4 not null default 0,
completed bool not null default false
);
`
func CreateTable(ctx *actor.Context, db string) (*sqldb.ExecuteResult, error) {
client := sqldb.NewProviderSqlDb()
return client.Execute(ctx, sqldb.Statement{
Database: db,
Sql: sql,
})
}
依赖关系
~13–30MB
~493K SLoC