drizzle-orm

ORM
- Object-Relational Mappingの頭文字
- オブジェクトと関係(関係データベース、RDB)とのマッピングを行うもの
- もっと簡単にいうと、SQLを直接書くことなく、オブジェクトのメソッドでDB操作ができる
SQLで書く場合、SELECT文で取得します。
SELECT * FROM users;
一方、Railsの場合はallメソッドを呼ぶだけです。
users = User.all

- SQLを書かなくてよい
- オブジェクト指向型言語で書ける
- RDBへの処理がカプセル化されている

Learn
Drizzle with Vercel Postgres
Vercel Postgresってなんやねん…
Vercel Postgres is a serverless SQL database designed to integrate with Vercel Functions and your frontend framework.

Drizzle Kit
migration toolkit?
Drizzle Kit — is a CLI companion for automatic SQL migrations generation and rapid prototyping.
migrationがいまいちイメージ湧いてない。DB設計変更への追従的なこと?
*1. 開発中の頻繁な変更*
開発段階では、新しい機能の追加や既存機能の修正に伴い、データベーススキーマの変更がしばしば必要となります。このような場合、Migrationツールを使用することで、以下のように変更を効率的に管理できます:
• 新しいテーブルやカラムの追加
• 既存テーブルの構造変更
• インデックスの追加・削除
• 既存カラムのデータ型変更
これにより、開発チーム全体でスキーマ変更の履歴を一貫して管理し、変更内容をチームメンバー全員に適用できます。
*2. リリース時の大規模な変更*
新しいバージョンのリリースやフルリニューアルプロジェクトなど、大きなDB構成の変更が必要になる場合、Migrationは非常に重要です。リリースプロセスにおいて:
• 事前に開発環境やステージング環境でMigrationを適用してテスト
• リリース時には、本番環境に対して同じMigrationを適用
このプロセスにより、スムーズなバージョンアップを実現し、データの整合性と可用性を保つことができます。
*3. 運用中の小規模な調整*
運用中にも、新たな要件やパフォーマンスの改善のためにスキーマ変更が必要になることがあります。例えば:
• 新しいインデックスの追加
• 一部のテーブルやカラムのリネーム
• 新しいデータリレーションシップの追加
運用中でもころころ変更が必要な場合、Migrationを利用することで、データベース変更の一貫性と安全性を維持できます。
まとめ
Migrationは「一回だけ」行うものではなく、開発、テスト、リリース、運用の各段階で頻繁に使用されるツールです。これにより、データベーススキーマのバージョン管理を行い、変更履歴を追跡し、複数の環境にわたる一貫性を保つことが可能になります。Migrationツールを利用することで、データベースの変更を効率的に管理し、スムーズに処理することができます。

Docs
Drizzle ORM is a headless TypeScript ORM with a head. 🐲
…?
It’s the only ORM with both relational and SQL-like query APIs, providing you the best of both worlds when it comes to accessing your relational data. Drizzle is lightweight, performant, typesafe, non-lactose, gluten-free, sober, flexible and serverless-ready by design. Drizzle is not just a library, it’s an experience. 🤩
グルテンフリー。
With data frameworks you have to build projects around them and not with them.
…?
Drizzle is the opposite. We embrace SQL and built Drizzle to be SQL-like at its core, so you can have zero to no learning curve and access to the full power of SQL.
ORMはSQLを隠蔽するものだと思っていたが、SQLに寄せている?
// Access your data
await db
.select()
.from(countries)
.leftJoin(cities, eq(cities.countryId, countries.id))
.where(eq(countries.id, 10))
確かにSQLっぽい書き方。
there are certain common scenarios where you can query data in a better way.
普通のORMっぽい書き方もできるよってこと?(普通のORMがわからんから普通なのかわからんが)
const result = await db.query.users.findMany({
with: {
posts: true
},
});

公式むずいからこれやってみる。最近の記事なのでバージョンずれも少なそう。しかもhono
Drizzle ORMはSQL-likeなコードでデータベースを管理/操作することができるTypeScript ORMです。
DrizzleはPrismaと同様に定義したスキーマから型を生成することができ、型安全にアプリケーションの開発を行うことができます。
ふむ
drizzle-kitは定義したスキーマファイルを利用してテーブルを作成/更新するために必要なマイグレーションファイルを作成するためのツールです。

Migrationファイルの作成
schema.tsをベースにdrizzle-kitがマイグレーションファイルを作ってくれる。
- schema.ts作成
npx drizzle-kit generate
- drizzleディレクトリが作成されて、metaディレクトリとsqlファイルが作成される
コマンド叩いたらSQLが生成された!!なるほど。
journalってファイルはなんやろ…サンプルデータ?
このコマンドを実行しただけでデータベース、テーブルが作成されるわけではありません。
DB作成用のコードを生成してくれただけ?

DBへの接続
- db.tsファイルでmigration関数を実行する記載
マイグレーションはテーブルの構成を変更した場合など必要な時にのみ実行
ふむ
後ほど説明するDrizzleの設定ファイルdrizzle.config.tsファイルを作成した後であればdrizzle-kit generateでマイグレーションファイルを作成後にdrizzle-kit migrateコマンドを実行することでマイグレーションファイルの情報をテーブルに反映させることができます。

drizzle 動作確認
npx ts-node index.ts
実行後dbディレクトリを確認するとsqlite.dbファイルが作成されている

データの登録
const result = db
.insert(todos)
.values({
name: "Learn Drizzle",
isCompleted: false,
})
.run();
importしてきたtodosにinsertするとデータが登録される。数制限したり個数を取ったりのメソッドもあるっぽい。

マイグレーションの動作確認
schemaを更新した場合。
- schema.tsを更新。今回はuserId列を追加
-
npx drizzle-kit generate --dialect='sqlite' --schema=./db/schema.ts
を実行して、マイグレーションファイルの作成
3._journal.json
のentriesに何かが追加された
4. 新しく0001_snapshot.json
が作成された。なんのスナップショット?
5. 新しく0001_clammy_mephistopheles.sql
が追加された。数字より後の単語はランダムぽい。内容はuserIdをADDするSQL
6. sqlite.dbが更新されたらしいがバイナリで見れない -
npx ts-node index.ts
を実行してみると列がたされている。
8. 実行時にSQLも実行されている。
9. 値はNull

列の削除
今までと同じでschema.tsを更新してdrizzle-kit generate
実行。
この場合、新しく作られるSQLはuserIdを削除するもの。なので一度追加して削除する、っていう動作をやることになる(当然といえば当然だが)

設定ファイル
drizzle.config.tsを設定すれば、drizzle-kit generateのオプションを省略できる
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "sqlite",
schema: "./db/schema.ts",
out: "./drizzle",
});

Drop migration
これはなんだ…?
最後のやつ選んで実行したら、
- SQLファイルごと削除
- snapshotファイルごと削除
- journalが対象行削除
- でもschema.tsは特に変わってない
もう一回generateしたら元に戻る?
→IDとかは変わったけど再生成された。generateを取り消す時用?

Drizzle Studio
設定してnpx drizzle-kit studio
したら、ブラウザでDBいじれる。すごい

Typeの設定(InferModel)
InferInsertModel/InferSelectModelでschemaとかから型が取れる

んーなんかdrop実行したからか、userIdがないのに削除しようとしてるっていうエラーがでるようになった。ADDのSQLは生きてるし、順番とかも問題無さそうなんだが…drop罠すぎんか。(dropのせいなのかどうかもわからんけど)
よくわからんから
-
/drizzle
配下を削除してみる。 -
npx drizzle-kit generate
3.Error: ENOENT: no such file or directory, open 'drizzle/meta/_journal.json'
- ファイル復活させる
- もういっかい
npx drizzle-kit generate
6. なんかいけた -
npx ts-node index.ts
8.DrizzleError: Failed to run the query 'ALTER TABLE
todosDROP COLUMN
userId;'
- 全部Dropしてみる
10.npx ts-node index.ts
→いけた
11.npx drizzle-kit generate
してからnpx ts-node index.ts
→いけない
12. エラーが変わってる?SqliteError: table
todosalready exists
うーむ、Tableを削除するか分岐をつければいいんだろうが、そのレベルすらわからん。。やり直すか。→いけた

Honoと使ってみる
dbを普通にimportしてきて使うだけなのか。
schemaとかdbとかの違いがまだイマイチわからんがなんとなく理解。