prismaでデータがあるテーブルの列追加をするパターンを考える

Prisma、便利ですよね。 マイグレーションを重ねていくと、あるテーブルに対して列追加しなければいけないこともあると思います。 そういったときにどう対処すればよいか考えてみました。 検証用のパッケージを作成する とりあえず検証用のパッケージだけ作成します。 mkdir prisma-paradigm-shift-pattern cd prisma-paradigm-shift-pattern yarn add -D typescript ts-node @types/node prisma yarn prisma init --datasource-provider sqlite prisma.schemaには、prismaのQuickStartにあるモデルを持ってきます。 // 参考モデル // https://www.prisma.io/docs/getting-started/quickstart model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? published Boolean @default(false) author User @relation(fields: [authorId], references: [id]) authorId Int } 一度最初のマイグレーションだけしておきましょう。 ...

8月 10, 2023 · にあえん

wasmに入門してみる【3】

前回の続きです。 wasmに入門してみる【1】 wasmに入門してみる【2】 wasmに入門してみる【4】 ライフゲームの実装(Rust側) うっすらイメージがついてきたところで実装に入ります。 まずは、src/lib.rsの内容を以下の実装で上書きします。 use wasm_bindgen::prelude::*; // セルの状態を表す列挙型を定義 #[wasm_bindgen] #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Cell { Dead = 0, Alive = 1, } #[repr(u8)]を定義すると、Enumのプロパティが1バイトとして表現できます。 また、生存を1として表現することで、周囲のセルの生存状況を単純な加算で取得することができます。 続けてライフゲームの盤上である宇宙を表現します。 // ライフゲームの盤上(宇宙)の表現を行う構造体 #[wasm_bindgen] pub struct Universe { width: u32, // 横幅 height: u32, // 縦幅 cells: Vec<Cell>, // 盤上の生存状況 } 特定の行と列にアクセスするために、前回説明した式を実装します。 index(row, column, universe) = row * width(universe) + column これは宇宙の実装として用意します。 impl Universe { fn get_index(&self, row: u32, column: u32) -> usize { (row * self.width + column) as usize } } また、セルの次の状態を計算するため、生存しているセルをカウントする関数もUniverseに実装してあげます。 ...

8月 9, 2023 · にあえん

wasmに入門してみる【2】

前回からの続きです。 wasmに入門してみる【1】 wasmに入門してみる【3】 wasmに入門してみる【4】 作成したCargoパッケージをnpmパッケージから使う さて、前回までの状態だとhello-wasm-packを使っているので、せっかくRustで作ったwasmを使えていません。 使用できるようにするため、まずは前回wasm-pack buildで作成したpkgディレクトリに移動し、npm linkというコマンドを実行します。 このコマンドを使うと、npmパッケージをパブリッシュせずに相互に参照することが可能になるそうです。へー。 {{ url_title “https://qiita.com/k_kind/items/b3d04bd5a47ee26b6e2d" }} さっそく実行してみます。 % npm link added 1 package, and audited 3 packages in 713ms found 0 vulnerabilities 実行すると、npm install --globalで指定した際のディレクトリにシンボリックリンクが作成されます。 % ls -l /home/username/.anyenv/envs/nodenv/versions/17.9.0/lib/node_modules lrwxrwxrwx 1 username username 59 8月 8 22:56 wasm-game-of-life -> ../../../../../../../Project/personal/wasm-game-of-life/pkg nodenvを使っているのでこのようなディレクトリになっています。 nodenvはバージョンごとにグローバルなパッケージがインストールされるディレクトリが変わるので、もしnodenvで開発する場合はnodeのバージョンはpkgとwwwの両方のディレクトリで合わせる必要があります。 .node-versionの配置を忘れないようにしないといけませんね! では続けて、wwwディレクトリに移動して、先程作成したリンクへの依存を追加していきます。 npm link wasm-game-of-life このコマンドを実行すると、node_modulesの中にwasm-game-of-lifeへのシンボリックリンクが作成され、先程作成したシンボリックリンクと紐付きます。 つまり、pkgへのシンボリックリンクを持つことになります。 # wwwディレクトリで実行 % ls -l node_modules | grep wasm-game-of-life lrwxrwxrwx 1 username username 9 8月 8 23:06 wasm-game-of-life -> ../../pkg 最後に、www/index.jsのインポートをwasm-game-of-lifeモジュールを参照するようにしてあげれば完成です! ...

8月 8, 2023 · にあえん

wasmに入門してみる【1】

社内でwasmを触っているプロジェクトの人と話して、羨ましかったので入門してみる。 wasmに入門してみる【2】 wasmに入門してみる【3】 wasmに入門してみる【4】 wasmとは ブラウザ上で高速に動作するバイナリファイルのことです。 WebAssemblyとは?何ができるのか?できないことやユースケースをわかりやすく解説 |パーソルクロステクノロジー 主にC++やRustで実装されています。 2023-08-07のwasmの対応状況はこんな感じです。 safariやモバイル版operaを除いて、ほぼほぼ対応していますね。 WebAssembly | Can I use... Support tables for HTML5, CSS3, etc Cargoプロジェクトを作成する とにかく実装したかったので、Rustで実装してみます。 公式にチュートリアルが用意してあったので、これをなぞる形でやっていこうと思います。 チュートリアル - Rust and WebAssembly チュートリアルを実施するに際して、以下の3つのツールが必要なのでインストールしておきます。 私の場合はcargo-generateとwasm-packがなかったのでインストールしておきました。 wasm-pack cargo-generate npm cargo-generateを使用して、以下のgithubリポジトリをベースにパッケージを作成します。 cargo generate --git https://github.com/rustwasm/wasm-pack-template 名前は以下のようにしておきます。 wasm-game-of-life これでwasmのチュートリアルパッケージが生成されました。 Cargo.tomlの中身は以下のようになっています。 [package] name = "wasm-game-of-life" version = "0.1.0" edition = "2018" [lib] crate-type = ["cdylib", "rlib"] [features] default = ["console_error_panic_hook"] [dependencies] wasm-bindgen = "0.2.84" # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires # all the `std::fmt` and `std::panicking` infrastructure, so isn't great for # code size when deploying. console_error_panic_hook = { version = "0.1.7", optional = true } [dev-dependencies] wasm-bindgen-test = "0.3.34" [profile.release] # Tell `rustc` to optimize for small code size. opt-level = "s" 見てみると、crate-typeというセクションがありますね。 ...

8月 7, 2023 · にあえん

prisma-client-rust + actix-webで簡単RESTクライアント実装

以前、prisma-clientでGraphQLに入門しました。 せっかくRustを触りだしたので、prismaでRustクライアントを出力できるprisma-client-rustを使用してRESTアプリケーションを構築してみたいと思います。 GitHub - Brendonovich/prisma-client-rust: Type-safe database access for Rust Cargoパッケージの初期化 まずは元になるパッケージを作成します。 % cargo new prisma-for-rest Created binary (application) `prisma-for-rest` package せっかくこの前学んだので、このパッケージに移動して安定版の最新バージョンを参照するrust-toolchain.tomlを作っておきます。 [toolchain] channel = "stable-2023-07-12" 続けてデータベース用のパッケージを作成します。 cargo new database データベース用のパッケージに移動し、prisma-client-rustを依存関係に追加します。 [dependencies] prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.6.8" } prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.6.8" } database/src/main.rsに、prisma-client-rust用のCLIを操作するための実装を追記します。 fn main() { prisma_client_rust_cli::run(); } prisma-client-rust-cliの呼び出しを簡素化するため、.cargo/config.tomlというファイルを作成して以下のような設定を追記します。 [alias] prisma = "run --" これにより、cargo prismaでprisma-client-rust-cliの呼び出しが可能になりました。 % cargo prisma --help Finished dev [unoptimized + debuginfo] target(s) in 0.49s Running `target/debug/database --help` ◭ Prisma is a modern DB toolkit to query, migrate and model your database (https://prisma.io) Usage $ prisma [command] Commands init Set up Prisma for your app generate Generate artifacts (e.g. Prisma Client) db Manage your database schema and lifecycle migrate Migrate your database studio Browse your data with Prisma Studio validate Validate your Prisma schema format Format your Prisma schema Flags --preview-feature Run Preview Prisma commands Examples Set up a new Prisma project $ prisma init Generate artifacts (e.g. Prisma Client) $ prisma generate Browse your data $ prisma studio Create migrations from your Prisma schema, apply them to the database, generate artifacts (e.g. Prisma Client) $ prisma migrate dev Pull the schema from an existing database, updating the Prisma schema $ prisma db pull Push the Prisma schema state to the database $ prisma db push Validate your Prisma schema $ prisma validate Format your Prisma schema $ prisma format prismaスキーマの初期化 Prisma CLIが使えるようになったので、CLIからPrismaの初期化を行います。 ...

8月 5, 2023 · にあえん

Rustのworkspaceの使い方

またまたRustについてです。 今回はworkspace機能についてよくわからなかったので勉強がてら書いていこうと思います。 Rustのワークスペースとは 大元であるCargoパッケージ内に複数パッケージがある場合に、相互にパッケージを扱うための機能です。 大きくなってきたプロジェクトで使用します。 Cargoのワークスペース - The Rust Programming Language 日本語版 公式のチュートリアルをなぞる形になりますが、やってみます。 まずはワークスペース機能のチュートリアルを行うCargoパッケージを作成します。 cargo new rust-workspace-playground 作成したパッケージに移動し、更にadderというパッケージを作成します。 cargo new adder この時点でcargo buildしても、adderの依存性をrust-workspace-playgroundには記述していないため、targetに出力されるのはrust-workspace-playgroundにあるhello worldプログラムのみです。 # cargo build実行後のtargetディレクトリの中身 target ├── CACHEDIR.TAG └── debug ├── build ├── deps │ ├── librust_workspace_playground-25fa51ac7f690b9a.rmeta │ ├── librust_workspace_playground-5cbc2718815bd853.rmeta │ ├── librust_workspace_playground-9f7880f2efd546b2.rmeta │ ├── rust_workspace_playground-01238b030f757f04 │ ├── rust_workspace_playground-01238b030f757f04.d │ ├── rust_workspace_playground-25fa51ac7f690b9a.d │ ├── rust_workspace_playground-5cbc2718815bd853.d │ └── rust_workspace_playground-9f7880f2efd546b2.d ├── examples ├── incremental │ ├── rust_workspace_playground-1xmwk187vqtbq │ ├── rust_workspace_playground-3oehp425tljca │ ├── rust_workspace_playground-3tb4u1zdv4nwu ├── rust-workspace-playground └── rust-workspace-playground.d ここで、rust-workspace-playgroundのCargo.tomlに以下のworkspaceセクションを追加します。 ...

8月 5, 2023 · にあえん

Rustのrust-toolchain.tomlについて

Rustが楽しくてAWS SAAの資格勉強が全然捗りません。かなしい(自業自得) 前回のブログで軽く触れた、プロジェクトでRustを動かす際に役立つrust-toolchainファイルについて勉強がてら紹介していこうと思います。 Rustのバージョン管理について プロジェクトのバージョン管理はそれぞれの言語で違います。 (nodeであればnodenv、pythonであればpyenvなど…) Rustの場合、使用するバージョンをプロジェクトごとに決める際は、rust-toolchain.tomlが役に立ちます。 Overrides - The rustup book これにより、各プロジェクトごとにRustのバージョンを切り替える必要がなくなります。 使用するためにはrustupのバージョンを1.23.0以上にしてあげる必要があります。 rust-toolchain.tomlの形式は以下のとおりです。 [toolchain] channel = "nightly-2023-08-03" components = [ "rustfmt", "rustc-dev" ] targets = [ "wasm32-unknown-unknown", "thumbv2-none-eabi" ] profile = "minimal" バージョンだけ指定するならchannelだけ指定してあげればいいです。 [toolchain] channel = "nightly-2023-08-03" これをCargoパッケージ配下に配置することで、バージョンの指定が可能になります。 もしインストールされていないバージョンが指定されていた場合、cargo buildなどを行うと以下のように自動でバージョンのインストールを行ってくれます。 以下はnightly-2023-08-03をインストールしていない状態でchannelにnightly-2023-08-03を指定し、cargo testを実行した際の出力です。 % cargo test info: syncing channel updates for 'nightly-2023-08-03-x86_64-unknown-linux-gnu' info: latest update on 2023-08-03, rust version 1.73.0-nightly (8131b9774 2023-08-02) info: downloading component 'cargo' info: downloading component 'clippy' info: downloading component 'rust-docs' info: downloading component 'rust-std' info: downloading component 'rustc' info: downloading component 'rustfmt' info: installing component 'cargo' info: installing component 'clippy' info: installing component 'rust-docs' info: installing component 'rust-std' info: installing component 'rustc' info: installing component 'rustfmt' Compiling helper v0.1.0 (/home/username/Project/study/rust-lib-and-bin-playground/helper) Finished test [unoptimized + debuginfo] target(s) in 0.72s Running unittests src/lib.rs (target/debug/deps/helper-bf168264d06a5721) running 2 tests test test::bench_add_two ... ok test test::test_add ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests helper running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s きちんとインストールされますね! ...

8月 5, 2023 · にあえん

【Rust】Cargoターゲットの使い分け方

やっと…仕事でRustを触れるようになりました!!! 嬉しい!! とはいえ、Rustでたまに実装しているものの、基本pythonでしか実装していない日々だったので、どういうルールがあったのかを忘れてしまいました。。 まずはCargoターゲットについて学習していきたいと思い、その備忘録になります。 CargoパッケージとCargoターゲットとは Rustでプロジェクトを作るときはまずcargo new [プロジェクト名]のように、cargoを利用してプロジェクトの基盤をまず作ると思います。 ここで作られたプロジェクトのことは「Cargoパッケージ」と言います。 Cargoパッケージには以下に分類されるコードを含めることができます。 library binary example test benchmark Cargo Targets - The Cargo Book library ライブラリは、Cargoパッケージから参照される想定のコードのことです。 CLIのようなバイナリとして実行するアプリケーションではなく、他のRustライブラリが参照することを想定して実装する場合はこちらを使います。 binary 文字通りバイナリとしてビルドし実行する想定のコードのことです。 こちらはライブラリのように他のRustライブラリが参照するというよりは、単体で動作するソフトウェアを作るのに役立ちます。 example 主にライブラリの使用例を表すコードのことです。 cargoの各コマンドで使用例を使うためのサポートがされています。 You can run individual executable examples with the cargo run command with the –example option. Library examples can be built with cargo build with the –example option. cargo install with the –example option can be used to copy executable binaries to a common location. ...

8月 3, 2023 · にあえん

PrismaでGraphQLに入門する

Prismaを使うとGraphQLが簡単にできるようなので、やってみました。 前回書いた、Prismaとdbdocsを組み合わせて使ってみたという記事の実質続きみたいな感じです。 ジェネレーターを実装する GraphQLを扱うためにはリゾルバという実装が必要なようですが、これをスキーマ定義から作成するようにします。 既に構築済みのprismaプロジェクトがある場合、typegraphql-prismaを追加するだけです。 yarn add -D typegraphql typegraphql-prisma 追加したら、schema.prismaに以下のgeneratorセクションを追加します。 generator typegraphql { provider = "typegraphql-prisma" } 追加したら以下のコマンドでリゾルバが作成されます。 npx prisma generate 作成されたリゾルバは、デフォルトではnode_modules/@generated/type-graphqlにあります。 GraphQLのサーバーを構築する 本題です。 Apolloを使用してGraphQLサーバーを構築しました。 実装はこちらを参考にしつつ行いました。 import { PrismaClient } from "@prisma/client"; import { ApolloServer, BaseContext } from "@apollo/server"; import { startStandaloneServer } from "@apollo/server/standalone"; import { resolvers } from "@generated/type-graphql"; import { buildSchema } from "type-graphql"; (async () => { const schema = await buildSchema({ resolvers, validate: false, }); const prisma = new PrismaClient(); interface Context { prisma: PrismaClient; } const server = new ApolloServer<Context>({ schema, }); const { url } = await startStandaloneServer(server, { context: async () => ({ prisma }), listen: { port: 4000 }, }); })(); 最新のApolloだと、contextの関数がasyncになっているので注意が必要です。 ...

7月 30, 2023 · にあえん

prisma + dbdocsで楽しくデータベース設計する

つい先日dbdocsに入門したという記事を書きましたが、dbdocsではDBマイグレーションの管理などはできないので、ちょっとそこが不満でした。 今回はPrismaに入門して、dbdocsと組み合わせることでGUIでも Prismaとは DBクライアント、DBマイグレーション、GUI出力といった機能が一体となったツールです。 Node.jsとTypeScriptを使用しています。 Prisma | Simplify working and interacting with databases DBクライアントやDBマイグレーションのプレイグラウンドも用意してあります。親切。 Prisma Playground | Learn the Prisma ORM in your browser とりあえずマイグレーションを体験してみる QuickStartに沿ってやっていきましょう。 TypeScriptのプロジェクトは既に作成した前提で、関連するモジュールを追加していきます。 npm install prisma --save-dev 次にprismaの初期化処理を行います。 あんまり凝った構成にすると疲れるので、とりあえずSQLiteを使います。 npx prisma init --datasource-provider sqlite すると、プロジェクトにprisma/schema.prismaというファイルが作成されます。 // This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } このファイルに以下のモデルを追加していきます。 ...

7月 30, 2023 · にあえん