概要
Cloud9でPostgreSQLを利用する場合毎回templateの更新が必要なのが面倒になってきたのでスクリプト化します。
準備
Cloud9にてRuby on Railsのプロジェクトテンプレートを選択し新しいワークスペースを作成します。
$ sudo service postgresql start
# python2のpsycopg2はすんなり入らなかったのでpython3を利用します
$ sudo pip3 install psycopg2
スクリプト
change_template.py
import psycopg2
import psycopg2.extras
connect = psycopg2.connect(dbname='postgres')
cursor = connect.cursor(cursor_factory=psycopg2.extras.DictCursor)
old_isolation_level = connect.isolation_level
connect.set_isolation_level(0)
cursor.execute("UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1'")
cursor.execute("DROP DATABASE template1")
cursor.execute("CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE'")
cursor.execute("UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1'")
cursor.execute("VACUUM FREEZE")
app_name = "my_app_name"
password = "pass"
cursor.execute("create role " + app_name + " with createdb login password '" + password + "'")
connect.commit()
connect.set_isolation_level(old_isolation_level)
postgrsユーザでこのスクリプトを実行します。
$ sudo sudo -u postgres python3 change_template.py
動作確認
psqlを起動してtemplate1のEncodingがUTF8になっていることを確認します。
$ sudo sudo -u postgres psql
ユーザ情報を確認
\du
Role name | Attributes | Member of
-------------+------------------------------------------------+-----------
my_app_name | Create DB | {}
postgres | Superuser, Create role, Create DB, Replication | {}
ubuntu | Superuser, Create role, Create DB | {}
データベースを確認
\l
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+-----------+---------+-------+-----------------------
postgres | postgres | SQL_ASCII | C | C |
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | C |
ubuntu | ubuntu | SQL_ASCII | C | C |
Rails
ここからはデフォルトのsqlite3をpgに置き換えて動作確認を行います。
Gemfile
gem 'pg'
$ bundle install
config/database.yml
default: &default
adapter: postgresql
encoding: unicode
pool: 5
username: my_app_name
password: pass
host: localhost
development:
<<: *default
database: my_app_name_development
test:
<<: *default
database: my_app_name_test
production:
<<: *default
database: my_app_name_production
$ rails g scaffold Post title:string body:text
$ rake db:migrate
$ rails s -b $IP -p $PORT
cloud9のポップするURLをクリックするか、上のメニューからPreview -> Preview Running Applicationを選択しrailsを表示させます。
または直接
https://workspaceName-UserName.c9users.io/posts
で確認できます。