開発者ドキュメント

CentOS7のDjangoアプリケーションでPostgreSQLを使用する方法

序章

Djangoは、Pythonアプリケーションをすばやく作成するための柔軟なフレームワークです。 デフォルトでは、Djangoアプリケーションはデータを軽量のSQLiteデータベースファイルに保存するように構成されています。 これはいくつかの負荷の下でうまく機能しますが、より伝統的なDBMSは本番環境でのパフォーマンスを向上させることができます。

このガイドでは、Djangoアプリケーションで使用するPostgreSQLをインストールして構成する方法を示します。 必要なソフトウェアをインストールし、アプリケーションのデータベースクレデンシャルを作成してから、このバックエンドを使用するように新しいDjangoプロジェクトを開始して構成します。

前提条件

開始するには、root以外のユーザーが設定されたクリーンなCentOS7サーバーインスタンスが必要です。 非rootユーザーは、sudo権限で構成する必要があります。 初期サーバーセットアップガイドに従って、これをセットアップする方法を学びます。

続行する準備ができたら、読み進めてください。

CentOSおよびEPELリポジトリからコンポーネントをインストールします

最初のステップは、リポジトリから必要なすべてのピースをインストールすることです。 Pythonコンポーネントをインストールして管理するために、Pythonパッケージマネージャーであるpipをインストールします。 また、データベースソフトウェアとそれらとの対話に必要な関連ライブラリをインストールします。

必要なソフトウェアの一部は、追加のパッケージを含むEPELリポジトリにあります。 次のように結び付けることで、このリポジトリを簡単に有効にできます。

sudo yum install epel-release

EPELを有効にすると、次のように入力して必要なコンポーネントをインストールできます。

sudo yum install python-pip python-devel gcc postgresql-server postgresql-devel postgresql-contrib

PostgreSQLの初期構成を実行する

インストール後、次のように入力してPostgreSQLデータベースを初期化する必要があります。

sudo postgresql-setup initdb

データベースが初期化されたら、次のように入力してPostgreSQLサービスを開始できます。

sudo systemctl start postgresql

データベースを起動したら、実際に入力された構成ファイルの1つで値を調整する必要があります。 エディタとsudoコマンドを使用して、今すぐファイルを開きます。

sudo nano /var/lib/pgsql/data/pg_hba.conf

このファイルは、データベースシステムの認証方法を構成する役割を果たします。 現在、システムユーザーがデータベースユーザーと一致する場合にのみ接続を許可するように構成されています。 これはローカルメンテナンスタスクには問題ありませんが、Djangoインスタンスにはパスワードで構成された別のユーザーがいます。

これは、ファイルの下部にある2つのhost行を変更することで構成できます。 最後の列(認証方法)をmd5に変更します。 これにより、パスワード認証が可能になります。

. . .

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5

終了したら、ファイルを保存して閉じます。

新しい構成の変更に伴い、サービスを再起動する必要があります。 また、PostgreSQLを有効にして、起動時に自動的に起動するようにします。

sudo systemctl restart postgresql
sudo systemctl enable postgresql

データベースとデータベースユーザーを作成する

デフォルトでは、Postgresはローカル接続に「ピア認証」と呼ばれる認証スキームを使用します。 これは、編集したpg_hba.confファイルのlocalエントリで確認できます。 基本的に、これは、ユーザーのオペレーティングシステムのユーザー名が有効なPostgresユーザー名と一致する場合、そのユーザーはそれ以上の認証なしでログインできることを意味します。

Postgresのインストール中に、postgresという名前のオペレーティングシステムユーザーが、postgresPostgreSQL管理ユーザーに対応するように作成されました。 管理タスクを実行するには、このユーザーに変更する必要があります。

sudo su - postgres

これで、postgresユーザーのシェルセッションに入るはずです。 次のように入力して、Postgresセッションにログインします。

psql

まず、Djangoプロジェクトのデータベースを作成します。 セキュリティ上の理由から、各プロジェクトには独自の分離データベースが必要です。 このガイドではデータベースをmyprojectと呼びますが、よりわかりやすいものを選択することをお勧めします。

CREATE DATABASE myproject;

SQLプロンプトですべてのコマンドをセミコロンで終了することを忘れないでください。

次に、データベースへの接続とデータベースの操作に使用するデータベースユーザーを作成します。 パスワードを強力で安全なものに設定します。

CREATE USER myprojectuser WITH PASSWORD 'password';

その後、作成したユーザーの接続パラメーターのいくつかを変更します。 これにより、データベース操作が高速化されるため、接続が確立されるたびに正しい値を照会して設定する必要がなくなります。

Djangoが期待するデフォルトのエンコーディングをUTF-8に設定しています。 また、デフォルトのトランザクション分離スキームを「読み取りコミット」に設定しています。これは、コミットされていないトランザクションからの読み取りをブロックします。 最後に、タイムゾーンを設定します。 デフォルトでは、DjangoプロジェクトはUTCを使用するように設定されています。

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';

これで、作成したデータベースへのアクセス権をデータベースユーザーに付与するだけで済みます。

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

SQLプロンプトを終了して、postgresユーザーのシェルセッションに戻ります。

\q

postgresユーザーのシェルセッションを終了して、通常のユーザーのシェルセッションに戻ります。

exit

仮想環境内にDjangoをインストールする

データベースがセットアップされたので、Djangoをインストールできます。 柔軟性を高めるために、Python仮想環境内にDjangoとそのすべての依存関係をインストールします。

次のように入力することで、これらの環境を作成できるvirtualenvパッケージを入手できます。

sudo pip install virtualenv

Djangoプロジェクトを保持するディレクトリを作成します。 その後、ディレクトリに移動します。

mkdir ~/myproject
cd ~/myproject

次のように入力することで、DjangoプロジェクトのPython要件を保存する仮想環境を作成できます。

virtualenv myprojectenv

これにより、Pythonとpipのローカルコピーが、プロジェクトディレクトリ内のmyprojectenvというディレクトリにインストールされます。

仮想環境内にアプリケーションをインストールする前に、それをアクティブ化する必要があります。 次のように入力してください。

source myprojectenv/bin/activate

プロンプトが変わり、仮想環境内で操作していることを示します。 このようになります(myprojectenv)user@host:~/myproject$

仮想環境がアクティブになったら、pipを使用してDjangoをインストールできます。 また、構成したデータベースを使用できるようにするpsycopg2パッケージもインストールします。

pip install django psycopg2

これで、myprojectディレクトリ内でDjangoプロジェクトを開始できます。 これにより、コード自体を保持する同じ名前の子ディレクトリが作成され、現在のディレクトリ内に管理スクリプトが作成されます。 これが正しく設定されるように、コマンドの最後にドットを追加してください。

django-admin.py startproject myproject .

Djangoデータベース設定を構成する

プロジェクトができたので、作成したデータベースを使用するようにプロジェクトを構成する必要があります。

子プロジェクトディレクトリ内にあるメインのDjangoプロジェクト設定ファイルを開きます。

nano ~/myproject/myproject/settings.py

ファイルの下部に、次のようなDATABASESセクションが表示されます。

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

. . .

これは現在、SQLiteをデータベースとして使用するように構成されています。 代わりにPostgreSQLデータベースが使用されるように、これを変更する必要があります。

まず、sqlite3バックエンドではなくpostgresql_psycopg2バックエンドを指すようにエンジンを変更します。 NAMEには、データベースの名前(この例ではmyproject)を使用します。 また、ログイン資格情報を追加する必要があります。 接続するには、ユーザー名、パスワード、およびホストが必要です。 デフォルトが選択されるように、ポートオプションを追加して空白のままにします。

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

終了したら、ファイルを保存して閉じます。

データベースを移行してプロジェクトをテストする

Django設定が構成されたので、データ構造をデータベースに移行してサーバーをテストできます。

まず、データベースへの移行を作成して適用することから始めます。 実際のデータはまだないので、これで初期データベース構造が設定されます。

cd ~/myproject
python manage.py makemigrations
python manage.py migrate

データベース構造を作成したら、次のように入力して管理者アカウントを作成できます。

python manage.py createsuperuser

ユーザー名を選択し、メールアドレスを入力し、アカウントのパスワードを選択して確認するように求められます。

管理者アカウントを設定したら、Django開発サーバーを起動して、データベースが正しく機能していることをテストできます。

python manage.py runserver 0.0.0.0:8000

Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、続いて:8000にアクセスして、デフォルトのDjangoルートページにアクセスします。

http://server_domain_or_IP:8000

デフォルトのインデックスページが表示されます。

URLの最後に/adminを追加すると、管理インターフェースへのログイン画面にアクセスできるようになります。

createsuperuserコマンドを使用して作成したユーザー名とパスワードを入力します。 次に、管理インターフェースに移動します。

調査が終了したら、ターミナルウィンドウでCTRL-Cを押して開発サーバーを停止できます。

管理インターフェースにアクセスすることにより、データベースにユーザーアカウント情報が保存されており、適切にアクセスできることを確認しました。

結論

このガイドでは、PostgreSQLをDjangoプロジェクトのバックエンドデータベースとしてインストールおよび構成する方法を示しました。 SQLiteは開発中および軽生産での使用中に負荷を簡単に処理できますが、ほとんどのプロジェクトは、よりフル機能のDBMSを実装することで恩恵を受けます。

モバイルバージョンを終了