Open22

drizzle-orm

kzk4043kzk4043

ORM

https://utouto97.hatenablog.com/entry/2021/07/21/224759

  • Object-Relational Mappingの頭文字
  • オブジェクトと関係(関係データベース、RDB)とのマッピングを行うもの
  • もっと簡単にいうと、SQLを直接書くことなく、オブジェクトのメソッドでDB操作ができる

SQLで書く場合、SELECT文で取得します。

SELECT * FROM users;

一方、Railsの場合はallメソッドを呼ぶだけです。

users = User.all
kzk4043kzk4043

Drizzle Kit

migration toolkit?

Drizzle Kit — is a CLI companion for automatic SQL migrations generation and rapid prototyping.

migrationがいまいちイメージ湧いてない。DB設計変更への追従的なこと?

gpt
*1. ​開発中の頻繁な変更​*

開発段階では、新しい機能の追加や既存機能の修正に伴い、データベーススキーマの変更がしばしば必要となります。このような場合、Migrationツールを使用することで、以下のように変更を効率的に管理できます:
•   新しいテーブルやカラムの追加
•   既存テーブルの構造変更
•   インデックスの追加・削除
•   既存カラムのデータ型変更
これにより、開発チーム全体でスキーマ変更の履歴を一貫して管理し、変更内容をチームメンバー全員に適用できます。

*2. ​リリース時の大規模な変更​*

新しいバージョンのリリースやフルリニューアルプロジェクトなど、大きなDB構成の変更が必要になる場合、Migrationは非常に重要です。リリースプロセスにおいて:
•   事前に開発環境やステージング環境でMigrationを適用してテスト
•   リリース時には、本番環境に対して同じMigrationを適用
このプロセスにより、スムーズなバージョンアップを実現し、データの整合性と可用性を保つことができます。

*3. ​運用中の小規模な調整​*

運用中にも、新たな要件やパフォーマンスの改善のためにスキーマ変更が必要になることがあります。例えば:
•   新しいインデックスの追加
•   一部のテーブルやカラムのリネーム
•   新しいデータリレーションシップの追加
運用中でもころころ変更が必要な場合、Migrationを利用することで、データベース変更の一貫性と安全性を維持できます。

まとめ
Migrationは「一回だけ」行うものではなく、開発、テスト、リリース、運用の各段階で頻繁に使用されるツールです。これにより、データベーススキーマのバージョン管理を行い、変更履歴を追跡し、複数の環境にわたる一貫性を保つことが可能になります。Migrationツールを利用することで、データベースの変更を効率的に管理し、スムーズに処理することができます。
kzk4043kzk4043

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
  },
});
kzk4043kzk4043

serverlessに強いってを推してそう。
serverlessに強いってなんやろ…

kzk4043kzk4043

公式むずいからこれやってみる。最近の記事なのでバージョンずれも少なそう。しかもhono

Drizzle ORMはSQL-likeなコードでデータベースを管理/操作することができるTypeScript ORMです。
DrizzleはPrismaと同様に定義したスキーマから型を生成することができ、型安全にアプリケーションの開発を行うことができます。

ふむ

drizzle-kitは定義したスキーマファイルを利用してテーブルを作成/更新するために必要なマイグレーションファイルを作成するためのツールです。

kzk4043kzk4043

Migrationファイルの作成

schema.tsをベースにdrizzle-kitがマイグレーションファイルを作ってくれる。

  1. schema.ts作成
  2. npx drizzle-kit generate
  3. drizzleディレクトリが作成されて、metaディレクトリとsqlファイルが作成される

コマンド叩いたらSQLが生成された!!なるほど。
journalってファイルはなんやろ…サンプルデータ?

このコマンドを実行しただけでデータベース、テーブルが作成されるわけではありません。

DB作成用のコードを生成してくれただけ?

kzk4043kzk4043

DBへの接続

  1. db.tsファイルでmigration関数を実行する記載

マイグレーションはテーブルの構成を変更した場合など必要な時にのみ実行

ふむ

後ほど説明するDrizzleの設定ファイルdrizzle.config.tsファイルを作成した後であればdrizzle-kit generateでマイグレーションファイルを作成後にdrizzle-kit migrateコマンドを実行することでマイグレーションファイルの情報をテーブルに反映させることができます。

kzk4043kzk4043

drizzle 動作確認

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

kzk4043kzk4043

データの登録

  const result = db
    .insert(todos)
    .values({
      name: "Learn Drizzle",
      isCompleted: false,
    })
    .run();

importしてきたtodosにinsertするとデータが登録される。数制限したり個数を取ったりのメソッドもあるっぽい。

kzk4043kzk4043

マイグレーションの動作確認

schemaを更新した場合。

  1. schema.tsを更新。今回はuserId列を追加
  2. 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が更新されたらしいがバイナリで見れない
  3. npx ts-node index.tsを実行してみると列がたされている。
    8. 実行時にSQLも実行されている。
    9. 値はNull
kzk4043kzk4043

列の削除

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

kzk4043kzk4043

設定ファイル

drizzle.config.tsを設定すれば、drizzle-kit generateのオプションを省略できる

drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "sqlite",
  schema: "./db/schema.ts",
  out: "./drizzle",
});
kzk4043kzk4043

Drop migration

これはなんだ…?

最後のやつ選んで実行したら、

  • SQLファイルごと削除
  • snapshotファイルごと削除
  • journalが対象行削除
  • でもschema.tsは特に変わってない

もう一回generateしたら元に戻る?
→IDとかは変わったけど再生成された。generateを取り消す時用?

kzk4043kzk4043

Drizzle Studio

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

kzk4043kzk4043

Typeの設定(InferModel)

InferInsertModel/InferSelectModelでschemaとかから型が取れる

kzk4043kzk4043

んーなんかdrop実行したからか、userIdがないのに削除しようとしてるっていうエラーがでるようになった。ADDのSQLは生きてるし、順番とかも問題無さそうなんだが…drop罠すぎんか。(dropのせいなのかどうかもわからんけど)

よくわからんから

  1. /drizzle配下を削除してみる。
  2. npx drizzle-kit generate
    3. Error: ENOENT: no such file or directory, open 'drizzle/meta/_journal.json'
  3. ファイル復活させる
  4. もういっかいnpx drizzle-kit generate
    6. なんかいけた
  5. npx ts-node index.ts
    8. DrizzleError: Failed to run the query 'ALTER TABLE todosDROP COLUMNuserId;'
  6. 全部Dropしてみる
    10. npx ts-node index.ts→いけた
    11. npx drizzle-kit generateしてからnpx ts-node index.ts→いけない
    12. エラーが変わってる?SqliteError: table todos already exists

うーむ、Tableを削除するか分岐をつければいいんだろうが、そのレベルすらわからん。。やり直すか。→いけた

kzk4043kzk4043

Honoと使ってみる

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