2016-06-29 11 views
1

私はDjangoプロジェクトを持っています。このプロジェクトには2つのデータベースがあり、Routerと書いてそのうちの1つをreadonlyとします。私はこのreadonlyデータベースを使用するいくつかのユニットテストを書いたが、私はpython manage.py testを実行すると、それはここでテーブルが読み込み専用テーブル(Django)のテストに存在しません

ProgrammingError: (1146, "Table 'test_arzesh-db.company' doesn't exist")

は、データベースの設定があると言う:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'broker-website', 
     'USER': 'root', 
     'PASSWORD': '', 
     'HOST': 'localhost', 
     'OPTIONS': { 
      "init_command": "SET foreign_key_checks = 0;", 
     }, 
    }, 
    'arzesh-db': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'arzesh-db', 
     'USER': 'root', 
     'PASSWORD': '', 
     'TEST_DATABASE': 'default', 
    }, 
    'TEST': { 
     'CHARSET': 'utf8', 
     'COALATION': 'utf8-unicode-ci', 
    } 
} 

そしてここでは、私のルータのコードです:ここで

class Router(object): 
    """ 
    A router to control all database operations on models in the 
    auth application. 
    """ 
    def db_for_read(self, model, **hints): 
     """ 
     Attempts to read auth models go to auth_db. 
     """ 
     if model._meta.app_label == 'arzesh': 
      return 'arzesh-db' 
     return 'default' 

    def db_for_write(self, model, **hints): 
     """ 
     Attempts to write auth models go to auth_db. 
     """ 
     if model._meta.app_label == 'arzesh': 
      return 'arzesh-db' 
     return 'default' 

    def allow_relation(self, obj1, obj2, **hints): 
     """ 
     Allow relations if a model in the auth app is involved. 
     """ 
     return True 

    def allow_migrate(self, db, app_label, model=None, **hints): 
     """ 
     Make sure the auth app only appears in the 'auth_db' 
     database. 
     """ 
     if app_label == 'arzesh': 
      return False 
     return True 

は読み取り専用のデータベースにあるモデルです:

class Company(models.Model): 
    def __unicode__(self): 
     return self.tick 

    id = models.AutoField(primary_key=True) 
    tick = models.CharField(unique=True, max_length=32) 
    name = models.CharField(max_length=128, unique=True) 

    class Meta: 
     managed = False 
     db_table = 'company' 

、ここでユニットテストでエラーを取得するラインである:すべての

company.objects.create(id=1, tick='a', name='a') 
+0

@ e4c5投稿を編集して情報を追加しました。ありがとう。 – Navid777

答えて

2

まずそれを言うために不正確だ、

Tests that require a database (namely, model tests) will not use your “real” (production) database. Separate, blank databases are created for the tests. ... The default test database names are created by prepending test_ to the value of each NAME in DATABASES

ので参考です

I've written some unit tests that use this readonly database

https://docs.djangoproject.com/en/1.9/topics/testing/overview/#the-test-database

これは、エラーが

ProgrammingError: (1146, "Table 'test_arzesh-db.company' doesn't exist")

であることによって確認されています。右のように、テストデータベースはどのように作成されますか?移行の内容に基づいています。しかし、あなたは

class Meta: 
     managed = False 
     db_table = 'company' 

managed = Falseがここにテーブルがテストデータベースに存在しませんので、何の移行は、作成されないことを意味しています。したがって、エラー。

解決策。 このテーブルを作成するRunSQLで手動で移行を追加します。そのためにSHOW CREATE TABLE companyのSQLを使用してください。最初

./manage.py makemigrations myapp --empty 

し、[編集]それにRunPythonまたはRunSQLコードを追加するには、新しく作成された移行ファイルを実行することができません。 RunSQLに渡すSQLは、mysqlコンソールにSHOW CREATE TBABLE companyで生成したSQLです。追加情報とサンプルについては、RunSQLドキュメントを参照してください。

+0

私は解決策を理解していません。どうすればいいですか?手動でテーブルを作成する必要がありますか? – Navid777

関連する問題