ポリミーイズム

PHPを勉強する若輩者(おっさん)。専門用語の意味はわりかし覚えていません。macOS Sierra 10.12.6

ExpressにSequelizeを導入し、PostgreSQLを使用する

目的

前回のExpressに、PostgreSQL + Sequelizeでmodel層の作成

PostgreSQLのインストール

普段はmysqlを使っているのでとりあえずHomebrewでPostgreSQLmacにインストール。

brew install postgresql

やった方がいいであろうこと(僕はやってません)

  • パスを通すこと
export PGDATA=/usr/local/var/postgres

PostgreSQLを起動・停止する際に「-D」オプションを渡す必要がなくなるので、やっておいた方がいいかもしれません。

/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)コールバックで変数名を新たに付けて受け渡しも可能。
その処理で得た結果の名前を便宜的に使用することが可能。

グリンピースの存在価値

問う。今日は問う。いと問う。
 
グリンピースの存在価値についてだ。あの緑の玉は誰が好んで食すのだろうか。当社(ニート)調べによるところ、どちらでもいいが7割、嫌いが3割。と怒涛の用無しっぷりを発揮している。
 
彼らは何故存在するのか。彩りのためだけに存在するならば、その辺の草を乗っけておけばいいだけなのである。食べる必要が最初から介在しない観賞用と決まり切ったその辺の草の方が、取り除くことが確定しているので精神上楽ではないだろうか。
 
「いや、普通に好きなんだけど」
場末の居酒屋で目の前に座る元ギャル、現在さも妖怪な風体をした、女は口を開く。正直な話、その魑魅魍魎はぼくの数少ない女友達の一人なのだが、この発言を聞いた時に、菩薩たらしめる考えを具備した僕でさえ、烈火の如く声を挙げた。
 
「好きなわけねぇだろ。それは俺がグリンピースが不必要といった言葉に対して、少なからずそんなことないよぅ、と、言ってあげたい。言わせて!そんな良心が久方ぶりにシャバの空気を吸いに来ただけで心の中では、必要か不必要かの二択の前では確かに不必要な存在だと自覚してるんだろぉ、おん?」
と迫るように言ったところ結構ガチめのトーンで気持ち悪いと言われたのだから、心は千々に乱れ、そのまま泥酔。知らずうちに財布が空になってたのであの妖怪は妖怪ではなく、スタンド・ハーヴェストだったのかもしれません。
 

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でアクセス。下記画面が表示されれば成功。
    f:id:uronorokun:20171031201507p:plain

次回

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.*

参考

http://d.sonicjam.co.jp/post/52541343939

反省

わからずコピペすることほど怖いものはないからね。今回はうまくいったからええけど次回からはコマンドも調べること。

1日1技術

初心者なりに調べて1日1技術記事にできないかなぁ、と口だけの僕はぽつねんと思い立った。

 

思い立ったら吉日と偉人の言葉があるようにさぁ書こう、と内なる天使はささやくがちょっと待てよと内なる悪魔は囁く。

 

初心者が書いた技術記事など間違いだらけの穴だらけなのにそんな中途半端な道標を公開するのは如何なものかと。間違いがそのまま歩き出したりしたら邪魔以外の何物でもなにだろうと。

 

そんな悪魔も天使もろとも投げ散らかして書けることを書こうと思うのであった。

仕事ってなんですか

うだるような暑さの中、上機嫌という名の空回りテンションを発揮したまま最寄り駅から帰宅途中に、ふと脳天にひらりひらりと舞い落ちてきたものが、

 

「そうだ、ブログを書こう」

 

だったのだから人間何が起こるかわからない。

 

人間というインパクトの大きい言葉を堂々と主張し、さも我人間代表也。といった面持ちで話を始める輩なんて十中八九ろくでもない糞野郎なのだけれど、何を隠そう僕自身は糞野郎なのだ。「糞」なんて言葉は松坂もびっくりするほどきれっきれなど直球な言葉だけれど、シチュエーション次第では蝶が吸い寄せられるような言葉でもあったりするそうな。小栗旬がはにかんだ笑顔で「自分糞野郎なんすよ」なんてホテルのバーで言おうものなら、あらん悪くない、悪くないデスゾ、と頭の中に光が射すかの如き明瞭感が得られるわけで。

 

それくらい言葉というものは多面的・多角的だからこそ、もうそれこそこの世の終わりなんじゃないかしらん、と思わざるを得ないほどに、職場で仕事の出来ない僕は、今日先輩に言われた「そろそろ本気で仕事のやり方考えて…」と怒りと諦めを濃縮還元したため息混じりの言の葉を聞いて、まぁ言うて冗談の類いやろう、なんて簡単に多面的な言葉と解釈し、逃げてきたわけ。

 

いや、もう仕事って何?と逆に問いたい。僕の好物なネットサーフィンをやれば、至るところに仕事が出来る男、仕事が出来るようになる方法なんて、キャッチーな言葉が祭りの人頭のように跋扈している訳だけれど、あんなもん読んでも一ミリ足りとも能力なんて向上しないわけで。あれあれ、仕事ってなんですか?なんて言っちゃってる僕自身、駅の階段を全力でのぼれば膝が笑い、顔の脂が洪水のように流れ出て、時折、なんか臭い、と源泉を探せば僕自身の顔の臭いだった、なんて事象が発生するくらいには、おっさんになったというのに、恐ろしいほど仕事が出来ない。時間が解決する類いの話はきっと妖怪やお化け、もののけの一種だともう心と耳を閉ざす心づもりである。

 

世の中には仕事の出来る人があふれているように思うが、そんな仕事が出来る話なんて眠たくなるだけじゃあありませんか。と僕は声を大にして言いたい。だから、今日から仕事が出来ない人の仕事の出来ない話を仕事の出来ない人のために綴っていこうと決意をあらたに、泣きながら寝ようと思います。仕事ってなんですか?