diadia

興味があることをやってみる

django postgresqlの設定

centos7にpostgresqlを入れてdjangoを動かしたい場合、どのような手続きを踏むか。記録しておく。手続きはインストール、初期化、djangoのsettings.pyの編集になる。

ゴールはsettings.pyにpostgresqlで作成したデータベース情報を登録する。そのために、サーバにpostgresqlをインストールしたり、データベースを作成したり、postgresqlpythonで扱うためのモジュールpsycopg2をインストールする必要がある。

順を追ってやっていく。
centosなのでyumでいろいろインストールしてきたわけだけど、postgresqlも同じくyumでインストールする。

まずpostgresqlのインストール

yum自体がpostgresql保有しているかまず確認する。それは以下のコマンドで確認することができる。

yum search postgresql 

そうすると以下のように自分の場合表示された(一部を表示している。)。

    
postgresql.i686 : PostgreSQL client programs
postgresql.x86_64 : PostgreSQL client programs
postgresql-contrib.x86_64 : Extension modules distributed with PostgreSQL
postgresql-devel.i686 : PostgreSQL development header files and libraries
postgresql-devel.x86_64 : PostgreSQL development header files and libraries
postgresql-docs.x86_64 : Extra documentation for PostgreSQL
postgresql-jdbc.noarch : JDBC driver for PostgreSQL
postgresql-jdbc-javadoc.noarch : API docs for postgresql-jdbc
postgresql-libs.i686 : The shared libraries required for any PostgreSQL clients
postgresql-libs.x86_64 : The shared libraries required for any PostgreSQL
                       : clients
postgresql-odbc.x86_64 : PostgreSQL ODBC driver
postgresql-pgpool-II.x86_64 : Pgpool is a connection pooling/replication server
                            : for PostgreSQL
postgresql-pgpool-II-extensions.x86_64 : Postgresql extensions for pgpool-II
postgresql-plperl.x86_64 : The Perl procedural language for PostgreSQL
postgresql-plpython.x86_64 : The Python2 procedural language for PostgreSQL
postgresql-plruby.x86_64 : PostgreSQL Ruby Procedural Language
postgresql-pltcl.x86_64 : The Tcl procedural language for PostgreSQL
postgresql-server.x86_64 : The programs needed to create and run a PostgreSQL
                         : server
postgresql-static.i686 : Statically linked PostgreSQL libraries
postgresql-static.x86_64 : Statically linked PostgreSQL libraries
postgresql-test.x86_64 : The test suite distributed with PostgreSQL
postgresql-upgrade.x86_64 : Support for upgrading from the previous major

必要なのはpostgresql,postgresql-serverです。それらをインストールすればpostgresqlは動く。 postgresql-develも必要だという話もあるが、よくわからない。分かったら更新する。
そういうわけで以下のようにしてインストールを実行する。

sudo yum install postgresql-server

そうすると以下のような依存関係にあるものも一緒にインストールされる。

Installed:
  postgresql-server.x86_64 0:9.2.24-1.el7_5                                              

Dependency Installed:
  postgresql.x86_64 0:9.2.24-1.el7_5       postgresql-libs.x86_64 0:9.2.24-1.el7_5      

インストールしたら初期化

インストール完了後、初期化させる必要がある。
postgresqlをインストールしてそのままサービスを起動しようとするとエラーになるからだ。そのエラー原因は初期化していないことである。そういうわけで初期化のコマンドが必要になる。 以下のコマンドで初期化できる。

$ sudo postgresql-setup initdb
Initializing database ... OK

これで初期化は完了しました。

サービスをスタート、起動

以下のコマンドで実行する

$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql

これで良いのかちょっと疑問

djangoとサーバのpostgresqlをつなげる

djangoのsettings.pyにデータベースの項目がある。こちらにデータベースの記述を行えばpostgresqlを利用することができると思われる。settings.pyの当該設定項目は以下になる。

    DATABASES = {
        'default': {
            'ENGINE': ,
            'NAME': '',  # データベース名
            'USER': '',  # ユーザ名
            'PASSWORD': '',  # password
            'HOST': '',  # DBがあるサーバのIPアドレスやホストを入力。空欄はローカルホスト
            'PORT': '',  # ポート番号を入力、
            }
        }    
    

上記の設定項目を埋めなければならない。つまり、ENGINE,NAME,USER,PASSWORD,HOST,PORTを埋めればdjangopostgresqlがつながると思われる。設定項目はpostgresqlに実在するデータベース情報を入力することになる。しかしながらENGINEとPORTに関してはデータベースを作成しないまでも入力できる項目である。以下のように入力すること。

    DATABASES = {
        'default': {
            'ENGINE':  'django.db.backends.postgresql_psycopg2', #新たに入力した項目         
            'NAME': '',  # データベース名
            'USER': '',  # ユーザ名
            'PASSWORD': '',  # password
            'HOST': '',  # DBがあるサーバのIPアドレスやホストを入力。空欄はローカルホスト
            'PORT': '5432',  # 新たに入力した項目(ポート番号を特に指定しなかったら''でも可)
            }
        }    
    

次にENGINEにpostgresql_psycopg2と入力したが、これはpythonpostgresqlを扱えるようにするためのものでサーバに以下のコマンドでインストールする。

sudo pip install psycopg2

settings.pyに入力すべき他の項目を埋めるためにデータベースを作成する。データベースのみでテーブルまでは作る必要はない。
postgresqlの使い方のイメージはここに。

 

sudo su postgres psql -l #これで今現在あるデータベースを参照できる(補足) psql [ユーザ名] #これでpostgesqlのユーザに変更することができる(補足)

データベースを以下のコマンドで作成し、次いでパスワードと一緒にユーザを作成する。

CREATE DATABASE [database名] ;

CREATE USER [ユーザ名] WITH PASSWORD '[パスワード]' ;

djangoと噛み合うような設定を行う。

ALTER ROLE [ユーザ名] SET client_encoding TO 'utf8' ;
ALTER ROLE [ユーザ名] SET default_transaction_isolation TO 'read committed';
ALTER ROLE [ユーザ名] SET timezone TO 'Asia/Tokyo';

このセット内容をデータベースに反映させるコマンドをが以下のもの。

GRANT ALL PRIVILEGES ON DATABASE [database名] TO [ユーザ名];
\q

これで作成したデータベースをsettings.pyに入力すると以下のようになる。

DATABASES = {
        'default': {
            'ENGINE':  'django.db.backends.postgresql_psycopg2', # 以前入力した項目         
            'NAME': '[database名]',  # 今回入力する
            'USER': '[ユーザ名]',  # 今回入力する
            'PASSWORD': '[パスワード]',  # 今回入力する
            'HOST': 'localhost',  # DBがあるサーバのIPアドレスやホストを入力。空欄はローカルホスト
            'PORT': '5432',  # 以前入力した項目(ポート番号を特に指定しなかったら''でも可)
            }
        }    

この状態でmakemigrationsをして何も問題が出ずに実行できたら良い。できなかった場合はpostgresqlの設定ファイルを編集していない可能性が高い。以下のようにして編集を行う。

vim /var/lib/pgsql/data/pg_hba.conf
#認証方法をpeerからmd5に変更
local   all     all     md5
sudo systemctl restart postgresql

これでmakemigrationsが通ればオッケイ。

python36 manage.py makemigrations    
python36 manage.py migrate

 

その他に必要なこと

上記のpostgresqlの設定ではまだユーザpostgresのパスワードを定めていない。これでは困ることが多いので以下のようにして定める。これはlinuxのコマンドで、パスワードを変えるコマンド。

$ su  
# passwd postgres
Changing password for user postgres.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

参考情報

DjangoにPostgreSQLを適用する

以下編集途中、削除する


settings.pyでpostgresqlを設定後、python manage.py runserver したらpeer認証に失敗しました。と出た。
これはデータベースアクセス先のユーザーとアクセスしようとするユーザーが一致しているときのみ認証できるという仕組みらしい。
これでは出来ないので、peer認証設定を変更する。
pg_hba.confはデータベース接続の際のクライアント認証の設定を記述するファイル。これをpeer認証からパスワード認証(md5)またはtrustに変更する。
パスはfindを使えば良い。
$ find -name pg_hba.conf
これで良い。また設定を変えたってことはシステムコントロールコマンドでリスタートが必要。