Deno で試すデータベースアクセス(Turso - Drizzle ORM 編)

先日 Turso を試した記事を投稿して Twitter で共有したら、Turso の CEO がすこぶる喜んでくれていた。

ORMとマイグレーションツール試したいと書いたら、Drizzle ORM を紹介してくれたのでこちらを試したい。
Drizzle ORM を始め上手いこと動かせなかったが、これもまた Drizzle ORM の開発者に助けられた。

できたことをまとめておきたい。

参考

実装

drizzle-orm を使用した実装は次のようになる。

turso-connect-drizzle-test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import "https://deno.land/std@0.182.0/dotenv/load.ts";
import { drizzle, LibSQLDatabase } from "https://esm.sh/drizzle-orm/libsql";
import {
integer,
sqliteTable,
text,
} from "https://esm.sh/drizzle-orm/sqlite-core";
import { createClient } from "https://esm.sh/@libsql/client";
import { desc} from 'https://esm.sh/drizzle-orm/expressions';
import { users } from "./db/schema.ts";

const client = createClient({
url: Deno.env.get("TURSO_DB_URL"),
authToken: Deno.env.get("TURSO_AUTH_TOKEN"),
});

const db:LibSQLDatabase = drizzle(client);

const users = sqliteTable("users", {
id: integer("id").primaryKey(),
name: text("name").notNull(),
});

const user = await db.insert(users).values(data).returning().get();
console.log(user);

const selectResult = await db.select().from(users).orderBy(desc(users.id)).limit(3).all();

console.log(selectResult);

client.close();

動かしてみると、次のようになる。

1
2
3
4
5
6
7
$ deno run -A .\turso-connect-drizzle-test.ts
{ id: 14, name: "USER-new" }
[
{ id: 14, name: "USER-new" },
{ id: 13, name: "USER-new" },
{ id: 12, name: "USER2-update" }
]

注意事項

試す中でできなかったことがいくつかあった。

マイグレーション

Drizzle ORM は関連ツールとしてマイグレーションツール(というか スキーム=>SQL の変換ツール) があるがこれは、Deno で動かない。

Issue が出ているので、そのうち改善すると思われるので待ちたい。

github.com - drizzle-team/drizzle-orm - Issues - Add Deno support

一部のメソッドが動かない

先に出したテストコードでは、order by している。
最初は where を書いていたが、こちらが現在公開されているバージョンでは、動作しないらしい。

サポートしてくれた drizzle のエンジニアが教えてくれた。
修正するそうなので、これもまた待ちたい。


Turso 関連でもう一本記事を書かせてもらった。
実は、マイグレーションを調べていたらこれまでお世話になった nessie の積極的なアップデートが終了する方針になっていた。

github.com - halvardssm/deno-nessie - Issues - Future of Nessie

Prisma が Deno で完全にサポートされることが目途になり、有料のサポートかリポジトリのフォークのオプションからユーザーは選ぶ必要がある。

仮に Turso に nessie を使うには、libsql 対応が必須になるので、この機能拡張は期待薄/望み薄にも思えます。

自分もフォークして拡張にチャレンジするか近い内に決める必要がありそうです。

では。