Edited at

PostgreSQLテンプレートのUTF8化をスクリプトで行う

More than 3 years have passed since last update.


概要

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

で確認できます。