ラベル DB の投稿を表示しています。 すべての投稿を表示
ラベル DB の投稿を表示しています。 すべての投稿を表示

2012-10-12

DjangoにDBのマイグレーションを行うプラグインを入れる

Djangoで manage.py syncdb をした場合、すでに存在するテーブルについては何も変更されません。models.pyをいじってスキーマを変更しても、それがDBに反映されません。
そこで、マイグレーションを行うプラグインの出番となります。どうもSouthが定番のようなので、これを入れます。

$ sudo pip install South

インストールに成功したら、settings.py を若干変更します。
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp', #自作のアプリ
    'south', #southをインストールする
    )
個人的な趣味としては、
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", "south_migrations"))
SOUTH_MIGRATION_MODULES = {
    'myapp': 'migrations.myapp',
}
という具合にして、マイグレーションのときに生成されるファイルが、プロジェクトのディレクトリの外につくられるようにしておくのがいいと思います。その方が、ローカルのプロジェクトをサーバー上にあげるときに都合がいいからです。

settings.py の編集が終わったら、普通に、manage.py syncdb をします。これによって、southが利用するDBのテーブルがつくられます。SOUTH_MIGRATION_MODULESを明示的に指定した場合は、親となるモジュール(上記の例ではmigrations)が存在しないとエラーになるので、ここでつくっておきます。ここまでできたら、

$ python ./manage.py convert_to_south myapp

を実行します。これにより、既存のアプリをsouthで管理するように設定できます。今後、モデルに変更があった場合は、

$ python ./manage.py schemamigration myapp --auto
$ python ./manage.py migrate myapp

とやれば、たいていはsouthが何とかしてくれるはずです。

2012-10-06

CentOSにPostgreSQLをインストール

yumでインストールします。
$ sudo yum -y install postgresql-server
依存関係により、

  • postgresql-server
  • postgresql-libs
  • postgresql-server

の3つがインストールされることになります。現在はバージョンは、8.4.13-1.e16_3です。

これでインストールはできているのですが、データベースサーバーが起動していないので、まだ利用することはできません。最初の起動のため、次の2つコマンドを打ちます。
$ sudo service postgresql initdb
$ sudo service postgresql start
ここで、initdbをせずにpostgresqlを起動しようとすると、次のようなエラーになります。
/var/lib/pgsql/data is missing. Use "service postgresql initdb" to initialize the cluster first.
                                                           [失敗]

CentOSを再起動したときにpostgresqlも自動的に起動されるように設定しておきます。
$ sudo chkconfig postgresql on

これでデータベースサーバーの起動はOKです。後は、ユーザーの設定を行います。
PostgreSQLのインストールと同時にpostgresというユーザーがつくられるようです。
$ id postgres
uid=26(postgres) gid=26(postgres) 所属グループ=26(postgres)
このユーザー "postgres" にパスワードを設定します。
$ sudo passwd postgres
パスワードが設定できたら、ユーザーを変更します。デフォルトでは、Ident認証という方式で認証を行うため、CentOSのユーザーとPostgreSQLのユーザーが一致していないとエラーになるようです。
$ su - postgres
後は、createdbでデータベースを作成したり、 psqlで接続したりできます。

Ident認証ではなく、パスワード認証に変更したい場合は、postgresqlにユーザーを追加した後で、設定を変更します。
postgresユーザーでパスワード認証を行いたい場合は、次のようにしてパスワードを設定します。
ALTER  USER  postgres  WITH PASSWORD  'newpassword';
という具合です。postgresユーザーは最初から存在するのでALTER USERですが、新規ユーザーを追加するのであれば代わりに、CREATE USER文を使います。

パスワード認証を行うためには、DBの設定も変更する必要があります。設定ファイルなどは、たいてい「/var/lib/pgsql/data/」以下にあるようです。今回修正するのは、
/var/lib/pgsql/data/pg_hba.conf
というファイルです。「local    all    ident」という行をコメントアウトして「local    all    password」を追加します。
#local   all         all                               ident
local   all         all                               password
これでパスワードで認証することができます。たとえばユーザーがpostgresのときに、
psql  -U  postgres
とやれば、postgresユーザーで接続できます。


DjangoからPostgreSQLに接続する場合は、データベースの設定に、django.db.backends.postgresql_psycopg2を指定します。さらに次のコマンドで必要なモジュールをインストールしなくてはいけません。
$ sudo yum -y install python-psycopg2

2012-02-28

MySQLとPostgreSQLのライセンス

MySQLとPostgreSQLでは、ライセンスが違います。
MySQLは、GPLライセンスと商用ライセンスの二つがあって、どちらにするか選べます。
PostgreSQLは、BSDライセンスです。

つまり、MySQLはオープンソースのプロジェクトであれば無料で使えますが、そうでなければ商用ライセンスを買わなければなりません。一方PostgreSQLは、どんなプロジェクトでも無料で使えます。

サーバー上で動かすプログラムをオープンソースにするのは、セキュリティ上の懸念もあって考えものです。DBが利用できればどれでもいい場合には、MySQLではなく、PostgreSQLを選んでおいた方が、ライセンス的にめんどうなことがなくて良さそうです。
また、DjangoでDBを使う場合は、特にPostgreSQLが推奨されているようです。