Heroku Postgres 和訳

Heroku Postgres は Heroku 上で動く SQL database service です。add-on として管理されており、提供されています。また、Heroku Postgres は PostgreSQL driver のあるどんな言語からも accessible です。具体的には、Heroku によってサポートされる全ての言語、フレームワーク(Java, Ruby, Python, Scala, Play, Node.js, PHP, Go, and Clojure)から Heroku Postgres にアクセスできます。

Heroku CLI を通じて実行できる様々な management commands に加えて、この Heroku Postgres は 「”web dashboard” という dataclips を create する機能」と「その他の追加的なサービス」をデータベースサービス上で実装してます。

Provisioning the add-on

作ったアプリケーションを Heroku上で実行できる entity にコンパイルする buildpacksというのがありますが、多くの buildpacks は自動的に Heroku Postgres instance を提供してくれます。

Your language’s buildpack documentationのページで、どの add-ons が自動的に提供されているのか確認できます。また、

heroku addons

を使えばアプリケーションに 提供された database を持っているか、どのプランなのか、を確認できます(下のように見れます)。

Add-on                             Plan      Price  State  
─────────────────────────────────  ────────  ─────  ───────
scheduler (scheduler-round-96601)  standard  free   created
 └─ as SCHEDULER

The table above shows add-ons and the attachments to the current app (young-tor-55488) or other apps.

もしprovisionされたデータベースがない、あるいは既存のデータベースをアップグレード、あるいはデータベースを新規作成したいなら、CLIからつくれます。

Create a new database

Heroku Postgres にはサービスのtier、レベルにまたがって、色々と種類があります(hobby, standard, premium, and enterprise.)。Choosing the Right Heroku Postgres Planを参考にしてプランを選択しましょう。もし最初のプランを変更したくなればスケーリングできます。

Heroku Postgres は CLI で以下のコマンドを叩けば任意の Heroku application に追加できます。

heroku addons:create heroku-postgresql:<PLANNAME>

例えば hobby-dev plan database を provision するなら、こうなります。

$ heroku addons:create heroku-postgresql:hobby-dev
Adding heroku-postgresql:hobby-dev to sushi... done, v69 (free)
Attached as HEROKU_POSTGRESQL_RED
Database has been created and is available

もし hobby-basic plan database を provision するならこうです。

$ heroku addons:create heroku-postgresql:hobby-basic

プランによってかかる5分くらいかかるかもしれません。pg:wait で状態を track できます。

$heroku pg:wait
Waiting for database HEROKU_POSTGRESQL_RED... done

一度 Heroku Postgres が DATABASE_URL か HEROKU_POSTGRESQL_COLOR_URL に加えられると、 app configuration で setting が使えるようになり、 setting は 新しく provision されたHeroku Postgres serviceへアクセスする URL を含みむようになります。

もし作成したデータベースがそのアプリにとって最初のものなら、データベースに対して DATABASE_URL が付与されます。そうでなければ、HEROKU_POSTGRESQL_COLOR_URLが作成されます。 heroku config で色々確認できます。環境変数とかも。下のは「最初のアプリ」ではないケースなので、”HEROKU_POSTGRESQL” で grep してますね。もし初めてのものなら、heroku config -s | grep DATABASE_URL とかで確認できます。


heroku config -s | grep HEROKU_POSTGRESQL HEROKU_POSTGRESQL_RED_URL=postgres://user3123:passkja83kd8@ec2-117-21-174-214.compute-1.amazonaws.com:6212/db982398

補足: –as という flag で add-on が使う alias を決められます。これで add-on が加える変数の名前を決められます。

$ heroku addons:create heroku-postgresql:hobby-dev --as USERS_DB
Adding heroku-postgresql:hobby-dev to sushi... done, v69 (free)
Attached as USERS_DB
Database has been created and is available  
$ heroku config -s | grep USERS_DB
USERS_DB_URL=postgres://user3123:passkja83kd8@ec2-117-21-174-214.compute-1.amazonaws.com:6212/db982398

Establish primary DB

上で「2つ目以降は HEROKU_POSTGRESQL_COLOR_URL になるけど –as で変えられるよ」と述べました。Heroku では、primary database の位置を保存するには DATABASE_URL を config var として使うことを推奨しています。single-database setups では先ほど述べたように、新しいデータベースは既に DATABASE_URL を持っています。

もし一つのアプリに複数のデータベースを持たせたいなら、以下のように primary database をセットします。

$ heroku pg:promote HEROKU_POSTGRESQL_RED
Promoting HEROKU_POSTGRESQL_RED_URL to DATABASE_URL... done

この段階で、空っぽな PostgreSQL database が与えられます。もし既存のデータソースからデータを populate したい場合は、import instructions の項目を見るか、アプリに接続する為に、この記事の言語ごとに記された導入方法に従ってください。

Sharing Heroku Postgres between applications

ちなみに、Heroku Postgres はアプリ間で共有できます。

$ heroku addons:attach my-originating-app::DATABASE --app sushi
Attaching postgresql-addon-name to sushi... done
Setting HEROKU_POSTGRESQL_BRONZE vars and restarting sushi... done, v1

データベースは色を表す単語がくっつきます。上の例では HEROKU_POSTGRESQL_BRONZE となってますが、場合によって変わります。 シェアしないので飛ばします。

Version support and legacy infrastructure

実行したい Postgres のバージョンは Heroku CLI の中で –version を使って確認できます。PostgreSQL project は年単位で新しい主流となるバージョンをリリースしてます。それぞれのバージョンは、一度リリースされれば、すぐ後に Heroku Postgres がサポートします。Heroku Postgres は少なくともその時ごとに3つのバージョンをサポートいます。現在サポートしているバージョンは以下のとおりです。

  • 9.6 (default)
  • 9.5
  • 9.4
  • 9.3
  • 9.2 (deprecated)

3つのバージョンをサポートしているということは、ユーザーは三年ごとにシステムをアップグレードしなくてはなりません。しかし、最新のバージョンの恩恵を受けたければ、いつでもアップグレードが可能です。

Heroku はときたま、Heroku のインフラ上の古いバージョン (Legacy Infrastructure) を deprecate します。なんでこんなことをするかというと、データベースの下で走ってるOSがセキュリティーのアップデートを受けられなくなったり、OSへのサポートが時代のために意味を成さなくなったり(必要なパッチなどが利用不可だったり)、サーバーのインスタンスが現行のインフラと大きくことなりサポートが現実的でなくなるかもしれないからです。データベースが legacy infrastructure で走っているかを確認するには、pg:info を使います・

$ heroku pg:info

=== HEROKU_POSTGRESQL_MAROON_URL (DATABASE_URL)
Plan:           Ronin
Status:         Available
Data Size:      26.1 MB
Tables:         5
PG Version:     9.5.3
Connections:    2
Fork/Follow:    Available
Rollback:       Unsupported
Created:        2012-05-02 21:54 UTC
Maintenance:    not required (Mondays 23:00 to Tuesdays 03:00 UTC)
Infrastructure: Legacy

Migration of deprecated databases

飛ばします。急には変えないけど、型落ちしたら変えてね、という話。

Performance analytics

飛ばします。

Local setup

これも飛ばします。ローカルでも動かせるようにね、という話と、各OSでの Postgres のインストールの話。

export DATABASE_URL=postgres:///$(whoami)

Set up Postgres on Linux

乱暴ですが、sudo でインストール、which で場所確認、psqlで確認です。


sudo apt-get install postgresql If you do not have a package manager on your distribution or the Postgres package is not available, install Postgres on Linux using one of the Generic installers. The psql client will typically be installed in /usr/bin: $ which psql /usr/bin/psql and the command should work correctly: $ psql psql (9.3.5) Type "help" for help. maciek# \q

ちなみに psql でロールが存在しないと怒られた。heroku pg:psql ではちゃんと接続できてそう。 ここで詰まってます。 ロール(ユーザー)の作成 sudo su – postgres で入って psql で起動して select rolname from pg_roles; をすると postgres しかない。

Using the CLI

Connecting in Python

to use PostgreSQL as your database in Python applications you will need to use the psycopg2 package.

$ pip install psycopg2
$ pip freeze > requirements.txt
And use this package to connect to DATABASE_URL in your code:
import os
import psycopg2
import urlparse

urlparse.uses_netloc.append("postgres")
url = urlparse.urlparse(os.environ["DATABASE_URL"])

conn = psycopg2.connect(
    database=url.path[1:],
    user=url.username,
    password=url.password,
    host=url.hostname,
    port=url.port
)

で使える。connさえできれば、あとはなんとでも。だから、あとはテーブルを作って、とかの作業。 と思ったら使えません。

注釈 urlparse モジュールは、Python 3 では urllib.parse にリネームされました。 2to3 ツールが自動的にソースコードの import を修正します。

2to3 使って差分取って直します。