TypeScriptでタイプセーフにSQLを実行する
#TypeScript #書きかけ #SQL
はじめに
TypeScriptとNode.jsでタイプセーフにSQLを実行できるライブラリをまとめます
ORMについてはNode.jsのORMについてを参照ください
SQLを直接書けるライブラリ
sqlc
SQLから様々な言語向けのコードを自動生成してくれるツールです
sqlc-gen-typescriptを利用することでTypeScriptコードを生成できます (node-postgres, postgres.js, node-mysql2, better-sqlite3あたりのドライバーに対応しています)
PgTypedと比較すると、sqlcにある様々な機能を活用できるのがメリット
ただし、sqlc-gen-typescriptは2023/12に公開された比較的新しいパッケージのため、安定性ではPgTypedの方が上だとは思います
PgTyped
sqlcと同様に*.sqlファイルにSQLを書いておき、そこからTypeScriptコードを自動生成できる
sqlc-gen-typescriptよりも長く開発・メンテナンスされ続けているのがメリット
sqlcとの違いとして、*.tsファイルにSQLを記述することも可能です
sqlcとは異なり、実際にデータベースへ接続してスキーマ情報を解析するため、ローカルなどにPostgreSQLのセットアップが必要です
自動生成したクエリはnode-postgresを使って実行できます
Prisma
v5.19.0からPrisma TypedSQLという機能が入り、sqlcやPgTypedなどと同様の使い方ができるようになりました
Slonik
node-postgresのラッパー
slonik-toolsで提供される@slonik/typegenを使うことで、ソースコード中のSQLを解析してTypeScriptの型を自動生成してくれます
kanel
Generate Typescript types from Postgres
これは試したことがないです..
zapatos
Zero-abstraction Postgres for TypeScript: a non-ORM database library
これは試したことがないです
ts-sql-query
Type-safe SQL query builder like QueryDSL or JOOQ in Java or Linq in .Net for TypeScript with MariaDB, MySql, Oracle, PostgreSql, Sqlite and SqlServer support.
これも試したことはありません
sqlx-ts
sqlxに影響を受けているようです
ソースコード中のsql(tagged templates)を使用して記述されたSQLを探索し、SQLの検証やTypeScriptのinterfaceの生成などを行ってくれるようです
クエリビルダー
Knex.js
おそらく一番有名なライブラリ
クエリビルダーとしての機能に加えてマイグレーションなどもサポートされています
Objection.jsやMikroORM, Bookshelf.jsなど、多くのORMで採用実績があります
kysely
マイグレーションをサポート
BunやDenoなどもサポート
kysely-codegenを使うことでデータベースのスキーマ情報から型定義を自動生成してくれるようです
Drizzle ORM
kyselyやKnex.jsライクなクエリの構築機能に加えて、Prismaライクな問い合わせAPIも提供されているようです
マイグレーションなどもサポートされています
mammoth
PostgreSQL向けのクエリビルダー
Denoでも動きそう
litdb
Lightweight RDBMS agnostic TypeScript/JS abstraction for SQLite, PostgreSQL and MySQL
所感
個人的にはPgTyped, sqlc, kysely+kysely-codegenあたりが柔軟で好み
PgTypedやsqlcは*.sqlファイルにクエリを書くことができ、柔軟性の高さや各種linterやformatter (sqlfluffなど)などのツールとの連携、SQLのレビューがしやすい点、軽量でCloudflare WorkersやDeno Deployなどとの相性も期待できる点などがメリットだと思います
複雑なクエリを特定の条件などに基づいて柔軟に構築したい場合は、クエリビルダーが便利だと思います (kysely, Drizzle ORMなど)