#数据库接口 #SQL 数据库 #WasmCloud #能力 #连接数据库 #SQL 查询

wasmcloud-interface-sqldb

WasmCloud Actor 连接到关系数据库的接口,使用 wasmcloud:sqldb 能力

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

Download history 191/week @ 2024-04-21 16/week @ 2024-04-28 86/week @ 2024-07-28

每月下载量 86

Apache-2.0 和可能 LGPL-3.0-or-later

41KB
838

crates.io  TinyGo 版本

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