(摘) Turso兼容并代替sqlite

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

sqlite大名鼎鼎,应用广泛. 但并发性一直是我头痛的问题.如果Turso支持超过10个并发,那将是我的应用首选.

“Turso引入了实验性的BEGIN CONCURRENT特性,通过多版本控制MVCC显著提升了写操作吞吐量,解决了SQLite在高并发写入场景下的性能瓶颈”. 但具体怎么样还等待验证.

Turso 是一个用 Rust 编写的进程内 SQL 数据库,兼容 SQLite。

跨平台支持,包括 Linux、macOS、Windows 和浏览器(通过 WebAssembly). 也提供go库:turso-go

提供本地数据加密保护. 这是我在sqlite中没看到的. 稍后可以看到go的示例.

还提供一个MCP服务器模式: tursodb xx.db –mcp. 支持打开库,列出表,查询,更新,删除,修改等操作.

package main

import (
	"database/sql"
	"fmt"
	"os"
	_ "github.com/tursodatabase/turso-go"
)

func main() {
	conn, err := sql.Open("turso", ":memory:")  // 内存数据库
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		os.Exit(1)
	}
	sql := "CREATE table go_turso (foo INTEGER, bar TEXT)"
	_, _ = conn.Exec(sql)

	sql = "INSERT INTO go_turso (foo, bar) values (?, ?)"
	stmt, _ := conn.Prepare(sql)
	defer stmt.Close()
	_, _ = stmt.Exec(42, "turso")
	rows, _ := conn.Query("SELECT * from go_turso")
	defer rows.Close()
	for rows.Next() {
		var a int
		var b string
		_ = rows.Scan(&a, &b)
		fmt.Printf("%d, %s", a, b)
	}
}

数据库加密

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/tursodatabase/turso-go"
)

func main() {

	key := "5d8a8f20e33bbe37a449b473f38469229d8772aa6250d6f32c5bb2587f46224f"
	dbPath := fmt.Sprintf("file:gottem.db?cipher=aegis256&hexkey=%s", key)

	db, err := sql.Open("turso", dbPath)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	_, err = db.Exec("create table if not exists t(x text);")
	if err != nil {
		log.Fatal(err)
	}
	_, err = db.Exec(`insert into t(x) values 
		('thick'), ('hugge'), ('bigger');`)
	if err != nil {
		log.Fatal(err)
	}

	rows, err := db.Query("select x from t;")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	fmt.Println("In t we have:")
	for rows.Next() {
		var val string
		if err := rows.Scan(&val); err != nil {
			log.Println(err)
			continue
		}
		fmt.Println("-", val)
	}
}