tag:crieit.net,2005:https://crieit.net/tags/Sequelize/feed 「Sequelize」の記事 - Crieit Crieitでタグ「Sequelize」に投稿された最近の記事 2019-05-03T09:19:45+09:00 https://crieit.net/tags/Sequelize/feed tag:crieit.net,2005:PublicArticle/14502 2018-08-10T23:09:11+09:00 2019-05-03T09:19:45+09:00 https://crieit.net/posts/Nuxt-js-Express-ORM Nuxt.js+Expressでとにかく簡単にORM <p>Nuxt.jsとExpressを使ってアプリケーションを作るとなると、やはりMySQL等を使うためにORMのライブラリが欲しくなります。Node.jsにはSequelizeというORMのライブラリがあり、それを使って簡単にデータベースを使うことが可能です。</p> <h2 id="趣旨"><a href="#%E8%B6%A3%E6%97%A8">趣旨</a></h2> <p>Sequelizeの使い方の説明は他のサイトの記事などがもっと参考になります。ただ、とりあえずすぐ簡単に使う、という趣旨の記事があまりなさそうだったのでそのあたりに重点を置いて書いてみます。</p> <p>ちなみに下記で作ったプロジェクトの続きとして作っています。<br /> <a href="https://crieit.net/posts/Nuxt-Express">Nuxt+Expressのプロジェクト作成で良さそうなのは?</a></p> <h2 id="インストール"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">インストール</a></h2> <p>インストールはマニュアル通りです。npmを使う場合はマニュアルを見てください。</p> <p><a target="_blank" rel="nofollow noopener" href="http://docs.sequelizejs.com/manual/installation/getting-started.html">Installation | Sequelize | The node.js ORM for PostgreSQL, MySQL, SQLite and MSSQL</a></p> <pre><code class="sh">// Using Yarn $ yarn add sequelize # And one of the following: $ yarn add pg pg-hstore $ yarn add mysql2 $ yarn add sqlite3 $ yarn add tedious // MSSQL </code></pre> <h2 id="初期化"><a href="#%E5%88%9D%E6%9C%9F%E5%8C%96">初期化</a></h2> <p>引き続き上記のマニュアルを見て初期化…ではなく、そこは飛ばして下記の通りにやっていきます。</p> <p><a target="_blank" rel="nofollow noopener" href="http://docs.sequelizejs.com/manual/tutorial/migrations.html">Tutorial | Sequelize | The node.js ORM for PostgreSQL, MySQL, SQLite and MSSQL</a></p> <p>どういうことかというと、最初のリンクの説明どおりに設定していかなくても、Sequelizeにはsequelize-cliというものもあり、それを使えばなんでもかんでもシェルでコマンド実行するだけで簡単にできてしまいます。</p> <h3 id="インストール"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">インストール</a></h3> <p>とりあえずはsequelize-cliをインストールします。(npmの場合はマニュアルどおりです)</p> <p>グローバルにインストールしておけば実行時にパスの指定が必要なくなります。</p> <pre><code>yarn add sequelize-cli </code></pre> <h3 id="初期化"><a href="#%E5%88%9D%E6%9C%9F%E5%8C%96">初期化</a></h3> <p>下記コマンドで初期化します。</p> <pre><code>node_modules/.bin/sequelize init </code></pre> <p>これでなんか必要なファイルを全部作ってくれます。</p> <p>config/config.jsonというファイルにデータベースへの接続情報設定がありますのでそちらに適宜入力していきます。とりあえず最初に試す時は直接入力してしまってOKです。</p> <p>時間のある時にでも生成されたmodels/index.jsを見ればわかりますが、config.jsonにuse_env_variableの設定を入れたりすると環境変数から読み込んだりもできるので、コミットしたり本番環境を作ったりする場合はそのあたりが使えると思います。</p> <h2 id="モデルとマイグレーションファイルを作成する"><a href="#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">モデルとマイグレーションファイルを作成する</a></h2> <p>ORMのため、マイグレーションファイルを作ってデータベースにテーブルを登録できるようにし、モデルを作ってアプリケーション上でデータを操作できるようにします。</p> <p>これもコマンドで簡単に作成できます。下記は本家に書かれている例です。</p> <pre><code class="sh">node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string </code></pre> <p>これでマイグレーションファイルとモデルのファイルが作成されます。createdAt, updatedAtというタイムスタンプのカラムも自動的に追加されます。このあたりは<code>--underscored</code>オプションを付けると<code>created_at</code>, <code>updated_at</code>のようにスネークケースで作成できます。他のフレームワーク等との互換性を考えるのであれば指定しましょう。</p> <h3 id="マイグレーションを実行"><a href="#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C">マイグレーションを実行</a></h3> <pre><code class="sh">node_modules/.bin/sequelize db:migrate </code></pre> <p>これで接続情報などが間違っていなければテーブルが作成されているはずです。</p> <p>ちなみに僕はDBまわりだけdocker-composeを使って用意しています。(もちろんローカル等でデータベースが動いている場合には不要です)</p> <pre><code class="yaml">version: '2' volumes: mysql_data: driver: local services: mysql: image: mysql:8.0 volumes: - mysql_data:/var/lib/mysql ports: - 3308:3306 environment: MYSQL_ALLOW_EMPTY_PASSWORD: "true" phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD= ports: - 8102:80 </code></pre> <p>よく分からない人はmysqlのバージョンを8ではなく5.6とか5.7にしてください。そうすれば<code>http://localhost:8102</code>でphpmyadminも使えるので簡単にデータベースが作成できます。動いてすっきりしたあとにでもまた調べてバージョンを上げてみてください。(ヒント:mysql_native_password)</p> <p>この場合接続設定はこんな感じです。</p> <pre><code class="json"> "development": { "username": "root", "password": null, "database": "yourdatabse", "host": "127.0.0.1", "port": "3308", "dialect": "mysql" }, </code></pre> <h2 id="実際にデータを読み書き"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D">実際にデータを読み書き</a></h2> <p>まずはSequelizeの設定を読み込んで使えるようにします。モデルなどは自動的に読み込んでくれるのでこの1文だけでOKです。</p> <pre><code>const models = require("../models"); </code></pre> <p><code>../models</code>は生成されたmodelsフォルダの位置です。階層が違う場合は適宜書き換えてください。</p> <p>ちなみにルーティングを別ファイルに分けている場合など、単にrequireしてもモデルがundefinedになっていることがありますので、その場合は最初にアプリケーションにmodelsを登録しておき、アクション内ではリクエストパラメータで取得すると良いです。</p> <pre><code class="javascript">app.set("models", require("../models")); </code></pre> <pre><code class="javascript">router.post("/posts", async function(req, res, next) { const Post = req.app.get("models").Post; </code></pre> <h3 id="書き込み"><a href="#%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF">書き込み</a></h3> <p>書き込み方法はいくつかあるので一例です。</p> <pre><code>models.User.build({ first_name: "Hoge", last_name: "Fuga" }) .save() </code></pre> <h3 id="読み込み"><a href="#%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF">読み込み</a></h3> <p>こちらも1例です。<code>plain: true</code>で取得すると単なるオブジェクトとして利用できるようになります。</p> <pre><code>router.get("/users", async function(req, res, next) { const users = await models.User.findAll(); res.json( users.map(user => { return user.get({ plain: true }); }) ); }); </code></pre> <p>例えばVueコンポーネント側で取得し</p> <pre><code class="javascript"> async asyncData() { let { users } = await axios.get("/api/users"); return { users }; } </code></pre> <p>受け取ったら下記のような感じで表示できます。上記の様にasyncDataで取っている場合はサーバーサイドレンダリングされています。</p> <pre><code class="html"> <div v-for="user in users" :key="user.id"> <span>{</span><span>{</span> user.name <span>}</span><span>}</span> </div> </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とりあえずsequelize-cliがあることでかなり初期設定を短縮できています。これがなかったら特にはじめての人とかは結構つまづく箇所が多いのではないかと思います。</p> <p>他の言語の他のフレームワークと比べてもさほど使い勝手も変わらず良さそうな感じがしました。</p> <p>追記)TypeScriptで使うTypeORMも触ってみましたので書いておきます。<br /> <a href="https://crieit.net/posts/TypeORM-5ca0b3d5385b1">TypeORMを使ってアプリケーションを作ってみての雑感</a></p> だら@Crieit開発者