7

私は、すべての単体テスト ケースが完全に機能する django プロジェクトに取り組んでいます。

2 番目のデータベースを導入するとすぐに、TestCase から継承したすべてのテスト ケースが壊れました。この段階では、その 2 番目のデータベースのテスト ケースは作成していませんが、ルーターは正常に動作しています。

テストを実行すると、エラーが発生します。

「KeyError: 'SUPPORTS_TRANSACTIONS'」

私がセットアップしたすべてのデータベースがトランザクションをサポートしていることを確認しようとしているように見えますが、2番目のデータベースは作成されません。

テスト スクリプトを使用して 2 番目のデータベースを構築する方法に関するアイデア。

4

5 に答える 5

9

これはかなり古いスレッドだと思いますが、同じ問題に遭遇しました。私の解決策はmulti_db = True、テストケースにフラグを追加することでした。

class TestThingWithMultipleDatabases(TestCase):
     multi_db = True

     def test_thing(self):
         pass

ソースhttps://github.com/django/django/blob/master/django/test/testcases.py#L861

これにより、djangoflushはすべてのデータベースを呼び出します (トランザクションをサポートしている場合はロールバックします)。

私もdbルーターを使用しています

残念ながら、Djangoのドキュメントでこれを見つけることができないため、そのリンクはありません

于 2016-09-18T07:53:53.307 に答える
3

はい、同様の問題がありました...私の修正は、設定ファイルの各データベース接続に対して 'SUPPORTS_TRANSACTIONS': True を設定することでした。これが正しい修正方法かどうかはわかりませんが、私にとってはうまくいきました。

于 2010-12-16T04:29:12.530 に答える
1

'SUPPORTS_TRANSACTIONS':True もうまくいきました。ただし、データベースルーターを使用した奇妙な複数のデータベース設定があります。@ user298404: 複数のデータベースのセットアップはどのように見えますか?

ps。ごめん; コメントするのに十分なポイントがありません...

于 2011-03-21T08:54:14.363 に答える
0

これは、現在本番環境にある複数のデータベース設定です。

DATABASES = {
    # 'default' is used as the WRITE (master) connection
    DB_PRIMARY_MASTER: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'main',
        'USER': 'main_write',
        'PASSWORD': 'XXXX',
        'HOST': 'db-master',
        'PORT': '3306',
        'SUPPORTS_TRANSACTIONS': True,
    },

    # Slave connections are READONLY
    DB_PRIMARY_SLAVE: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'main',
        'USER': 'main_read',
        'PASSWORD': 'XXXX',
        'HOST': 'db-slave',
        'PORT': '3306',
        'TEST_MIRROR': DB_PRIMARY_MASTER,
        'SUPPORTS_TRANSACTIONS': True,
    },

    # 'mail_default' is used as the WRITE (master) connection for the mail database
    DB_MAIL_MASTER: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbmail',
        'USER': 'dbmail_write',
        'PASSWORD': 'XXXX',
        'HOST': 'db-mail-master',
        'PORT': '3306',
        'SUPPORTS_TRANSACTIONS': True,
    },

    # Slave connections are READONLY
    DB_MAIL_SLAVE: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbmail',
        'USER': 'dbmail_read',
        'PASSWORD': 'XXXX',
        'HOST': 'db-mail-slave',
        'PORT': '3306',
        'TEST_MIRROR': DB_MAIL_MASTER,
        'SUPPORTS_TRANSACTIONS': True,
    },
}

DB_PRIMARY_MASTER、DB_PRIMARY_SLAVE、DB_MAIL_MASTER、および DB_MAIL_SLAVE はすべて文字列定数であるため、データベース ルーターで使用できます。
ヒント: DB_PRIMARY_MASTER='default'

これが役立つことを願っています!

于 2011-04-14T23:53:55.103 に答える