エラー概要
DjangoでPostgreSQL
をローカル環境にDB構築中、以下のエラーが出てきました。
"init_command"
とは??
invalid connection option "init_command"
こちらのエラーの原因と解決方法を紹介します。
原因
原因は、settings.py
に不要な一文があったためでした。
元々MySQLのDatabase設定を行なっていたsettings.py
のDATABASES
をコピーして、'ENGINE'
を'django.db.backends.postgresql_psycopg2'
に書き換えていたのですが、その際に一緒にinit_command
も消しておく必要がありました。
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
'default': {
# Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': DATABASE,
'USER': USER,
'PASSWORD': PASSWORD,
'HOST': HOST,
'PORT': '5432'
# このオプションはコメントアウトする
# 'OPTIONS': {
# 'init_command':
# 'SET character_set_connection=utf8,collation_connection=utf8_unicode_ci'
# }
},
}
このinit_command
というオプションはMySQLのPythonドライバであるmysqlclient
やPyMySQL
では使用されますが、PostgreSQLのPythonドライバであるpsycopg
ではサポートされていないのです。
以下のstackoverflowでも同じエラーの方がいました。
Django installation picking up wrong path names for migrate after project was copied
init_commandは
とは?
init_command
は、Djangoのデータベース接続の初期化時に実行されるSQLコマンドを指定するための設定。
上記のコメントアウトされたinit_command
の場合、接続が確立されたときにUTF-8の文字セットとUTF-8の照合順序を設定するSQLコマンドが指定されています。
また、psycopg2
で実施した場合のエラーは以下でしたが、
django.db.utils.ProgrammingError: invalid dsn: invalid connection option "init_command"
psycopg
に設定して実施した場合は、以下のエラーメッセージでした。
psycopg.ProgrammingError: invalid connection option "init_command"
補足1:
Mysqlでデータベースの文字セット(character set
)や照合順序(collation
)を調べる場合は以下のSQL。
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';
Postgresの場合は以下で可能です。
SELECT datname, pg_encoding_to_char(encoding) AS character_set, datcollate
FROM pg_database
WHERE datname = 'myproject_db';
補足2:
大前提、psycopg2
(もしくはpsycopg
)のインストールは必要です。
pip install psycopg2
インストールしていない場合、以下のエラーが出てきます。
raise ImproperlyConfigured("Error loading psycopg2 or psycopg module")
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 or psycopg module
psycopg
とは、PythonからPostgreSQLデータベースにアクセスするためのドライバのことです。