ExpressにSequelizeを導入し、PostgreSQLを使用する
- 目的
目的
前回のExpressに、PostgreSQL + Sequelizeでmodel層の作成
PostgreSQLのインストール
普段はmysqlを使っているのでとりあえずHomebrewでPostgreSQLをmacにインストール。
brew install postgresql
やった方がいいであろうこと(僕はやってません)
- パスを通すこと
export PGDATA=/usr/local/var/postgres
PostgreSQLを起動・停止する際に「-D」オプションを渡す必要がなくなるので、やっておいた方がいいかもしれません。
- TIPS : postgresqlのローカルパス
/usr/local/var/postgres
PostgreSQLの簡易的な使い方
サーバー起動
pg_ctl start -D /usr/local/var/portgres
サーバー停止
pg_ctl stop -D /usr/local/var/postgres
データベース接続
psql -d [db_name]
別データベースに接続
\connect [db_name]
テーブル定義を確認
\d [table_name]
テーブル一覧を表示
\z
PostgresSQLから切断
\q
PostgreSQLに事前準備
PostgreSQLにデータベース作成
createdb express_sample
PostgreSQLにてユーザ作成
create user root
PostgreSQLユーザに権限付与
GRANT SELECT, UPDATE, INSERT, DELETE ON express_sample TO root;
PostgreSQLユーザー指定データベースアクセス
psql -d express_sample -Uroot
PostgreSQL, Sequelizeをpackage.jsonに書き込む
npm i -S sequelize npm i -S pg
オプション「-S」は-save(package.json)に書き込むの略。
ちなみに「i」はinstallの略。
sequelize-cliをインストール
npm install -g sequelize-cli
コマンドラインから sequelize のmigrationを実行できる
sequelize init Sequelize CLI [Node: 8.6.0, CLI: 3.0.0, ORM: 4.19.0] WARNING: This version of Sequelize CLI is not fully compatible with Sequelize v4. https://github.com/sequelize/cli#sequelize-support Created "config/config.json" Successfully created models folder at "/User/express_test/sampleapp/models". Successfully created migrations folder at "/Users/express_test/sampleapp/migrations". Successfully created seeders folder at "/Users/express_test/sampleapp/seeders".
Warningが出てる。
内容としては、「このバージョンのSequelize CLIは、Sequelize v4と完全に互換性がありません。」とのことみたい。
とりあえず無視して継続。
Expressのsequlizeのconfig設定(DB接続周り)
{ "development": { "username": "root", "password": "xxx", "database": "express_sample", "host": "127.0.0.1", "dialect": "postgres" }, "test": { "username": "root", "password": "xxx", "database": "express_sample", "host": "127.0.0.1", "dialect": "postgres" }, "production": { "username": "root", "password": "xxx", "database": "express_sample", "host": "127.0.0.1", "dialect": "postgres" } }
Sequelizeを利用したmvcの構築
movieテーブルを作成する
イメージ
youtubeの動画を登録するテーブルテーブル
カラム名 | 型 | 備考 |
---|---|---|
id | auto_increment | |
title | varchar | |
video_id | varchar | |
upload_date | date | yyyy-mm-dd |
tag | integer | 将来tagテーブルを作成する |
is_delete | boolean |
└ 「tag」はtag_idとかに名称を変更するべきかな。
Sequelizeにて上記テーブルのmodelを作成する
sequelize model:create --name movie --underscored --attributes title:string,video_id:string,tag:integer,upload_date:date,is_delete:boolean
オプションを設定しない場合は、自動的にid, createdAt, updatedAtが作成される。
もし、キャメルケースでcreatedAt等作成されるのがいやなら、「--underscored」オプションを追加してあげるとよい。スネークケースの「created_at」と命名される。
生成されたmigrationファイル(default値を設定)
'use strict'; module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('movies', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, title: { type: Sequelize.STRING }, video_id: { type: Sequelize.STRING, unique: true }, tag: { type: Sequelize.INTEGER }, upload_date: { type: Sequelize.DATE }, is_delete: { type: Sequelize.BOOLEAN, defaultValue: false }, created_at: { allowNull: false, type: Sequelize.DATE }, updated_at: { allowNull: false, type: Sequelize.DATE } }); }, down: (queryInterface, Sequelize) => { return queryInterface.dropTable('movies'); } };
└ TODO : video_idはnotNull制約が必要やったなぁ…。
db migration実行 テーブル作成
sequelize db:migrate
アプリ側のCRUDを実装する前に先にテストデータをインサート
INSERT INTO movies (title, video_id, tag, upload_date, is_delete, created_at, updated_at) VALUES ('xxx', 'xxx1', 1, '2014-5-18', false, now(), now()), ('xxx', 'xxx2', 1, '2014-5-19', false, now(), now()), ('xxx', 'xxx3', 1, '2014-5-20', false, now(), now()), ('xxx', 'xxx4', 1, '2014-5-21', false, now(), now()), ('xxx', 'xxx5', 1, '2014-5-22', false, now(), now());
select実装
routes/index.js
const models = require('../models'); router.get('/', function(req, res, next) { models.movie.findAll().then(function(results) { res.render('index', {movies: results}); }); });
views/index.jade
each movie in movies .movie img(src='http://i.ytimg.com/vi/#{movie.video_id}/default.jpg') p.day #{movie.upload_date} a.links(href='https://youtu.be/#{movie.video_id}') p ##{movie.id} #{movie.title}アップロードしました。
使用法の所感
わかった。
Controllerにmodel層を読み込ませて、models.xxxで呼び出し。その処理が終わったら(then)コールバックで変数名を新たに付けて受け渡しも可能。
その処理で得た結果の名前を便宜的に使用することが可能。
グリンピースの存在価値
Express
目的
Expressをインストールし、Expressの初期画面を表示する。
Expressとは
サーバーサイドjavascript、Node.jsのフレームワーク。
REST APIを想定しているのか、mvcの構造にするには自分で追加する必要がある。
Expressをインストール
npm install -g express
npmのバージョンを5.4.2にしろって怒られたのでアップデート。
npm i -g npm
express-generatorをインストールする
npm install -g express-generator
Expressの元を作成する
CakePHPで言うbake。Ruby on Railsで言うscaffold。
express sampleapp
便宜的にsampleappという名称で作成。
sampleappに移動したのちに依存ライブラリをインストール
npm install
package.json内部に記載されたものがnode_moduleディレクトリに展開(インストール)される
Expressを立ち上げる
node bin/www もしくは npm start
普通にnode bin/wwwではターミナルが特に変わらんから起動してるかわかりづらい。
Expressの画面を表示する
- localhost:3000でアクセス。下記画面が表示されれば成功。
次回
PostgreSQLとSequelizeを利用し、mvcの仕組みを作成。
Node.js, npm, nodebrew
背景
npmのバージョンもnodeのバージョンも低かったので、再インストール
Macなので、Homebrewを使用し行う。
また、nodebrewを使用し、今後nodeの管理を行う。
参考
手順
現時点でのnode,npmのバージョンを確認
node --version npm --version
└ 最初に叩いた時には、npmは存在したのだが、その後npmアップデート(下記コマンド)をしようとしたら消滅。
npm update -g npm
参考
nodebrewをインストール
npmは消えたが、nodeはversion0.10.33とかいうベータのようなバージョンが入っていたので、nodebrewをそのままインストールすることで、依存関係の解決を行なってくれると一縷の望みを抱き続行。
- 実行コマンド
brew install nodebrew
- 結果
==> Deleted Formulae abi-compliance-checker kes rexster elixirscript mapnik@2 rexster-console gh node@0.10 szl go-gui node@0.12 tcpurify jpeg@9 phantomjs@1.92 kafka@0.80 phantomjs@1.98 /usr/local/Homebrew/Library/Homebrew/brew.rb:12:in `<main>': Homebrew must be run under Ruby 2.3! (RuntimeError)
└ おいおい、エラー出てんぞ。Rubyのバージョンが高いんか?
Rubyバージョン確認
ruby -v ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin13]
rbenv(Rubyのバージョン管理)より試しに2.2.2を入れる
rbenv install -l # インストール可能なリストを表示 rbenv install 2.2.2
Rubyバージョンを切り替える
rbenv global 2.2.2 rbenv versions
バージョンを切り替えた後にnodebrewをインストール
brew install nodebrew
└ 成功。
nodebrewにパスを通す
echo 'export PATH=$PATH:/Users/uronoro/.nodebrew/current/bin' >> ~/.bashrc - /.bash_profileに下記追加 if [ -f ~/.bashrc ]; then . ~/.bashrc fi
node.jsのバージョン確認
nodebrew ls-remote # リモートで管理されているNode.jsのバージョンを調べる
node.js最新バージョンをインストール
nodebrew install-binary latest
└ エラー出てんぞ。(今期2度目)
Fetching: https://nodejs.org/dist/v8.6.0/node-v8.6.0-darwin-x64.tar.gz Warning: Failed to create the file Warning: /Users/uronoro/.nodebrew/src/v8.6.0/node-v8.6.0-darwin-x64.tar.gz: No Warning: such file or directory curl: (23) Failed writing body (0 != 941) download failed: https://nodejs.org/dist/v8.6.0/node-v8.6.0-darwin-x64.tar.gz
└ ディレクトリないよーって言われてる気がしたので、ディレクトリを作成
ディレクトリを作成
mkdir -p ~/.nodebrew/src
npmがないままやからインストール
curl -L https://www.npmjs.org/install.sh | sh
nodeのバージョン足りんぞと怒られる(今期3度目)
ERROR: npm is known not to run on Node.js v0.10.33 You'll need to upgrade to a newer version in order to use this version of npm. Supported versions are 4, 6, 7, 8. You can find the latest version at https://nodejs.org/ ERROR: npm is known not to run on Node.js v0.10.33 You'll need to upgrade to a newer version in order to use this version of npm. Supported versions are 4, 6, 7, 8. You can find the latest version at https://nodejs.org/ It failed
nodeの使用バージョンとnodebrewでインストールしたバージョンが一致せんぞ。
元々いれてしまっていたNode.jsのバージョン(0.10.33)が邪魔しているのかな。
元々いれていた古いバージョンが原因?
この線で考えていったときに、ずっと表示されていたnode v0.10が原因かな、とnodeごと削除。ターミナル再起動。
nodeとnpmのバージョン確認できた。okかな?今後はnodebrewで管理すること。
既存のnodeを削除
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \ | while read i; do sudo rm /usr/local/${i} done sudo rm -rf /usr/local/lib/node \ /usr/local/lib/node_modules \ /var/db/receipts/org.nodejs.*
参考
反省
わからずコピペすることほど怖いものはないからね。今回はうまくいったからええけど次回からはコマンドも調べること。
仕事ってなんですか
うだるような暑さの中、上機嫌という名の空回りテンションを発揮したまま最寄り駅から帰宅途中に、ふと脳天にひらりひらりと舞い落ちてきたものが、
「そうだ、ブログを書こう」
だったのだから人間何が起こるかわからない。
人間というインパクトの大きい言葉を堂々と主張し、さも我人間代表也。といった面持ちで話を始める輩なんて十中八九ろくでもない糞野郎なのだけれど、何を隠そう僕自身は糞野郎なのだ。「糞」なんて言葉は松坂もびっくりするほどきれっきれなど直球な言葉だけれど、シチュエーション次第では蝶が吸い寄せられるような言葉でもあったりするそうな。小栗旬がはにかんだ笑顔で「自分糞野郎なんすよ」なんてホテルのバーで言おうものなら、あらん悪くない、悪くないデスゾ、と頭の中に光が射すかの如き明瞭感が得られるわけで。
それくらい言葉というものは多面的・多角的だからこそ、もうそれこそこの世の終わりなんじゃないかしらん、と思わざるを得ないほどに、職場で仕事の出来ない僕は、今日先輩に言われた「そろそろ本気で仕事のやり方考えて…」と怒りと諦めを濃縮還元したため息混じりの言の葉を聞いて、まぁ言うて冗談の類いやろう、なんて簡単に多面的な言葉と解釈し、逃げてきたわけ。
いや、もう仕事って何?と逆に問いたい。僕の好物なネットサーフィンをやれば、至るところに仕事が出来る男、仕事が出来るようになる方法なんて、キャッチーな言葉が祭りの人頭のように跋扈している訳だけれど、あんなもん読んでも一ミリ足りとも能力なんて向上しないわけで。あれあれ、仕事ってなんですか?なんて言っちゃってる僕自身、駅の階段を全力でのぼれば膝が笑い、顔の脂が洪水のように流れ出て、時折、なんか臭い、と源泉を探せば僕自身の顔の臭いだった、なんて事象が発生するくらいには、おっさんになったというのに、恐ろしいほど仕事が出来ない。時間が解決する類いの話はきっと妖怪やお化け、もののけの一種だともう心と耳を閉ざす心づもりである。
世の中には仕事の出来る人があふれているように思うが、そんな仕事が出来る話なんて眠たくなるだけじゃあありませんか。と僕は声を大にして言いたい。だから、今日から仕事が出来ない人の仕事の出来ない話を仕事の出来ない人のために綴っていこうと決意をあらたに、泣きながら寝ようと思います。仕事ってなんですか?