DATABASES = {
# 'default': {
# 'ENGINE': 'postgresql_psycopg2',
# ...
# }
# for unit tests
'default': {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
}
2つのデータベースがあります。1つは単体テストに使用したいデータベースで、もう1つは他のすべてに使用したいデータベースです。これをDjango 1.2.4で設定できますか?
(私が尋ねる理由は、postgresqlでは次のエラーが発生するためです:
foo@bar:~/path/$ python manage.py test
Creating test database 'default'...
Got an error creating the test database: permission denied to create database
Type 'yes' if you would like to try deleting the test database 'test_baz', or 'no' to cancel: yes
Destroying old test database...
Got an error recreating the test database: database "test_baz" does not exist
このエラーが発生するのはなぜですか?ユニットテストに常にSQLiteを使用できるかどうかはあまり気にしないと思います。
あなたのsettings.py
(またはlocal_settings.py
):
import sys
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
これを処理する方法は、複数の設定ファイルを使用することです。これを使用して、各インスタンスに変更を加えた共通設定のセットを維持するためです。他のいくつかのソリューションよりもセットアップが少し複雑ですが、ローカル開発、リモート開発、ステージング、およびプロダクションの設定が少し異なるため、とにかくそれを行う必要がありました。
https://code.djangoproject.com/wiki/SplitSettings には、設定を管理するための多くのオプションがあり、 https:// code.djangoproject.com/wiki/SplitSettings#SimplePackageOrganizationforEnvironments
だから、私のDjangoプロジェクトディレクトリには、次のような設定フォルダーがあります。
$ tree settings
settings
├── defaults.py
├── dev.py
├── dev.pyc
├── __init__.py
├── lettuce.py
├── travis.py
├── unittest.py
共通の設定はsettings/defaults.pyにあり、これらをインスタンス設定ファイルにインポートします。したがって、settings/unittest.pyは次のようになります。
from defaults import *
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': 'my_database',
}
}
次に、テストを実行するときに、次のコマンドを実行します。
$ ./manage.py test --settings=settings.unittest
テストにsqliteを使用します。別のテストランナーまたはデータベース構成を使用する場合は、別の設定モジュールを使用します。
settings.py
に既にテストデータベースを指定できることに言及したいです。 https://docs.djangoproject.com/en/2.0/ref/settings/#test を参照してください:
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql',
'USER': 'mydatabaseuser',
'NAME': 'mydatabase',
'TEST': {
'NAME': 'mytestdatabase',
},
},
}
これにより、テストの実行が劇的に加速しました。
import sys
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'Django.db.backends.sqlite3',
'TEST_CHARSET': 'UTF8', # if your normal db is utf8
'NAME': ':memory:', # in memory
'TEST_NAME': ':memory:', # in memory
}
DEBUG = False # might accelerate a bit
TEMPLATE_DEBUG = False
from Django.core.management import call_command
call_command('syncdb', migrate=True) # tables don't get created automatically for me
これはすでに解決されていますが...
テスト用のデータベースが通常のDBである場合:
データベースに依存しているため、ユニットテストを行っていないと思います。とにかく、Djangoにはそのテストタイプが含まれています(ユニタリではない):Django.test.TestCase
Django.test.TestCase
の代わりにunittest.TestCase
から派生する必要があります。これは、テストの終了時に破棄される新しい復元データベースを作成します。
次のリンクには、dbを使用したテストに関する興味深い説明/ヒントがあります。
テストDjangoアプリケーション
データベースを手動で作成するアクセス権がある場合は、TEST_RUNNERとして Django-nose を使用できます。インストール後、次の環境変数を渡すと、データベースは削除および再作成されません。
REUSE_DB=1 ./manage.py test
また、以下をsettings.pyに追加して、テストを実行するたびにREUSE_DB = 1を記述する必要がないようにすることもできます。
os.environ['REUSE_DB'] = "1"
注:これにより、すべてのテーブルがデータベースに残り、テストのセットアップが少し速くなりますが、モデルを変更するときに、テーブルを手動で更新する必要があります(またはデータベースを削除して再作成する必要があります)。
他の設定定数を作成するだけでこの問題を解決しましたDATABASES_AVAILABLE
。
DATABASES_AVAILABLE = {
'main': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'nep',
'USER': 'user',
'PASSWORD': 'passwd',
'Host': 'localhost',
},
'remote': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'nes_dev',
'USER': 'usr',
'PASSWORD': 'passwd',
'Host': '200.144.254.136',
},
'sqlite': {
'ENGINE': 'Django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
}
# This solves the problem with tests
# Define a system variable called Django_DATABASE_TEST and set it to the
# the database you want
database = os.environ.get('Django_DATABASE_TEST', 'main')
DATABASES = {
'default': DATABASES_AVAILABLE[database]
}
このエラーが発生するのはなぜですか?
権限が不十分なため。スーパーユーザー権限でpsql
を実行した後、ALTER USER username CREATEDB;
によってユーザーのアクセス許可を変更できます。
例、
$ Sudo su - postgres
$ psql
psql (9.3.18)
Type "help" for help.
postgres=# ALTER USER username CREATEDB;
ALTER ROLE