PrismaでGraphQLに入門する

Prismaを使うとGraphQLが簡単にできるようなので、やってみました。 前回書いた、Prismaとdbdocsを組み合わせて使ってみたという記事の実質続きみたいな感じです。 ジェネレーターを実装する GraphQLを扱うためにはリゾルバという実装が必要なようですが、これをスキーマ定義から作成するようにします。 既に構築済みのprismaプロジェクトがある場合、typegraphql-prismaを追加するだけです。 https://prisma.typegraphql.com/docs/intro 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サーバーを構築しました。 実装はこちらを参考にしつつ行いました。 https://prisma.typegraphql.com/docs/basics/usage 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になっているので注意が必要です。 ...

2023年7月30日 · にあえん

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

つい先日dbdocsに入門したという記事を書きましたが、dbdocsではDBマイグレーションの管理などはできないので、ちょっとそこが不満でした。 今回はPrismaに入門して、dbdocsと組み合わせることでGUIでも Prismaとは DBクライアント、DBマイグレーション、GUI出力といった機能が一体となったツールです。 Node.jsとTypeScriptを使用しています。 Prisma | Instant Postgres plus an ORM for simpler db workflows 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") } このファイルに以下のモデルを追加していきます。 ...

2023年7月30日 · にあえん

nodenvのnpmでインストールしたyarnからglobal addで追加したパッケージが使用できなかったときの対策

グローバルに追加したいパッケージがどうもうまく動いてくれなかったときの対応策を備忘録として残します。 このありがたい記事のおかげで助かりました。 nodenv管理下の npm で yarn を install した時に yarn の PATH が通らなかった時の対処メモ #YARN - Qiita 結論 yarn global add ...やnpm install -g ...の実行後、以下のコマンドを実行します。 nodenv rehash これで使えるようになりました。 めでたしめでたし。

2023年7月29日 · にあえん

dbdocsでDBML管理入門してみる、あわよくばCI/CDもやる

DBML、便利ですよね。 https://dbml.dbdiagram.io/home/ 開発初期の段階でER図の共有やSQLのエクスポートなどで非常に役立つツールです。 しかし、それは開発初期の話。 開発が進むにつれて実装とDBMLに齟齬が生じてしまうため、メンテナンスがされなくなっていってしまいます。。 今回は、DBMLの管理をローカルから行うことが可能なdbdocsというツールを見つけたので、紹介したいと思います。 dbdocs.io - Database Documentation and Catalog Tool 使い方 早速インストールしてみます。 npm install -g dbdocs (余談ですが、僕の環境ではnodenvを使用していたんですが、この-gオプションでインストールしたパッケージがうまく動かなかったので直したときの記事もあるので良ければこちらもどうぞ↓) nodenvのnpmでインストールしたyarnからglobal addで追加したパッケージが使用できなかったときの対策 無事インストールできたら、まずはdbdocsにログインしましょう。 dbdocs login Choose a login methodと表示されたので、Githubを選択するとWebブラウザに遷移するので、そこでログインを行うとトークンが発行されます。 発行されたトークンをターミナルに貼り付ければログイン完了です。 では次にdbmlファイルを実装します。 今回は簡易的にDBエンジンとしてPostgresを使用し、ユーザーテーブルのみがあるデータベースを設計しました。 Project social_blogging_site { database_type: 'PostgreSQL' } Table user { id uuid [pk] name varchar [not null] create_time timestamp [not null] update_time timestamp [not null] archive_time timestamp } これをdatabase.dbmlとして保存し、以下のコマンドを実行します。 dbdocs build database.dbml --project=test 無事作成が完了すると、以下のような画面が表示されます。 Visitに書かれているURLに遷移すると、プロジェクトページに遷移することができます。 また、画面上部のRelationをクリックすると各テーブルの依存関係を見ることができます。 これだけだと分かりづらいので、テーブルを増やしてみます。 ...

2023年7月29日 · にあえん

pythonでmarkdownをplain textに変換し、ginzaで文章を文ごとにリスト化する

markdownをplain textにしたうえで、その文章をginzaでリスト化しました。 必要なライブラリをインストールします。 pip install Markdown beautifulsoup4 ginza ja-ginza 以下のような実装を行いました。 from bs4 import BeautifulSoup from markdown import markdown import re import spacy def markdown_to_text(markdown_string): """マークダウンを平文に変換します""" # md -> html -> text since BeautifulSoup can extract text cleanly html = markdown(markdown_string) # remove code snippets html = re.sub(r'<pre>(.*?)</pre>', ' ', html) html = re.sub(r'<code>(.*?)</code >', ' ', html) # extract text soup = BeautifulSoup(html, "html.parser") text = ''.join(soup.find_all(string=True)).replace("\n", " ") return text def split_sentences(text): nlp = spacy.load('ja_ginza') doc = nlp(text) sentences = [sent.text for sent in doc.sents] return sentences if __name__ == "__main__": markdown_string = """# タイトル ## サブタイトル これは段落です。 これは別の段落です。 """ text = markdown_to_text(markdown_string) print(text) sentences = split_sentences(text) print(sentences) 出力は以下のとおりです。 ...

2023年7月19日 · にあえん

poetry installやpoetry lockが動かない場合の対処法

いつも通り開発していたのに、poetry installを行ったら急に全く動かなくなりました。 そんな場合の対処法について発見したので共有します。 対処法 poetry cacheコマンドを利用してキャッシュの削除を行います。 まず、poetry cache listでキャッシュの一覧を表示します。 次に、先程表示したキャッシュ一覧の名前を使用してpoetry cache clear --all [キャッシュ名]とタイプします。 すべてのキャッシュ一覧に対してこの操作を実行後、poetry installを実施したらうまく動きました。 めでたしめでたし。

2023年1月6日 · にあえん