基礎使用#
參考 https://docs.turso.tech/quickstart#select-all-rows-from-table 快速入門文檔
- 安裝 turso cli
- 登錄、註冊 turso
- 創建一個資料庫
- 展示資料庫狀態
- 進入資料庫 shell
- 寫 sql 創建 table、插入數據、查詢數據 - 這部分後面用 drizzle 來完成
- 複製資料庫到另一個區域 locations
使用比較簡單,後續業務中連接資料庫有 sdk 和 http 連接兩種方案
- 獲取 db 的 url
- 獲取 jwt 的 token
- 安裝
@libsql/client
- 基於
createClient
創建 client - client 執行 sql
基於 drizzle ORM#
關聯:
- [[Drizzle ORM 文檔速通]]
- [[01 - 了解探索 sqlite 和 Cloudflare D1]]
- [[node + sqlite]]
- [[better-sqlite3]]
drizzle 和 sqlite 有一流的支持,連 AstroDB 都是基於 drizzle 封裝的。
使用方式
- 安裝
drizzle-orm
和@libsql/client
依賴 - 安裝
drizzle-kit
開發依賴,用來生成 sql、遷移 sql 開發間操作drizzle-kit generate
生成drizzle-kit migrate
遷移drizzle-kit studio
頁面查看
- 獲取 db 的 uri 和 jwt token
- 創建
db/schema.ts
導出 table 定義 - 配置
drizzle.config.ts
設置 schema 位置、驅動、連接參數 - 使用 libsql 創建 client 實例,使用 drizzle 包裝,用吧
- 修改了 schema 要 generate 生成 sql、通過 migrate 遷移資料庫
- 使用 studio 的方式查看數據
看文檔額外提到,可以用 sentry 來獲取 sql 慢查詢、sql 錯誤
基於 http 方式#
libsql 遠程協議
- 獲取 db 的 url 和 token
- 基於 http 的 url 補齊
/v2/pipeline
- 準備 json 的 payload 參數,execute 和 close
- 使用 post 發送,查詢結果
- 發送過程中提到了參數索引和參數命名
為什麼要 close ?不 close 的話 10s 內根據 ctx 還能續上。
這種方式是基於 http 的,屬於獨有的連接方案,可以輕鬆在任何場合連接,有點意思。
關鍵詞解釋#
- sqlite 是 db 本身
- turso 是整套方案的封裝
docker 自托管#
通過下面可以實現免鑒權方案攔截托管的 libsql-server,但是帶 jwt 鑒權的還得再看看。
文檔地址
https://github.com/tursodatabase/libsql/blob/main/docs/DOCKER.md
在 m1 芯片的蘋果上使用這個
docker run --name some-sqld -p 8080:8080 -ti \
-e SQLD_NODE=primary \
--platform linux/amd64 \
ghcr.io/tursodatabase/libsql-server:latest
數據持久化
環境變量
- sqld_node=primary/replica/standalone
- 數據卷
-v sqld-data:/var/lib/sqld
- db 位置,本質還是 sqlite,
SQLD_DB_PATH=iku.db
- 遠程 jwt 授權
sqld_auth_jwt_key_file
傳遞一個 key.pem 私鑰,- 也可以使用
SQLD_AUTH_JWT_KEY
直接傳遞字符串
- 也可以使用
jwt 長什麼樣,希望後續可以通過 http 來連接和操作
{
"requests": [
{ "type": "execute", "stmt": { "sql": "SELECT * FROM users" } },
{ "type": "close" }
]
}
托管服務快速代碼#
# 展示 url
turso db show my-db --http-url
# token
turso db tokens create my-db
參考 https://www.json.cn/jwt/
https://jwt.io/
// header
{
"alg": "EdDSA",
"typ": "JWT"
}
// payload
{
"iat": 1726756735,
"id": "81220406-4854-4d4b-817e-61f4a092cdc4"
}