2016-06-29 22 views
1

Ich habe ein Django Projekt. Es gibt 2 Datenbanken in diesem Projekt und ich habe eine Router geschrieben, um eine von ihnen readonly zu machen. Ich habe einige Unit-Tests geschrieben, die diese readonly Datenbank verwenden, aber wenn ich python manage.py test laufen, sagt esTabelle existiert nicht beim Testen einer schreibgeschützten Tabelle (Django)

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

Hier werden die Einstellungen von Datenbanken ist:

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', 
    } 
} 

Und hier ist der Code meines Routers:

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 

Hier ist das Modell, das in der Nur-Lese-Datenbank ist:

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' 

und hier ist die Linie, die Fehler in Unittest bekommt:

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

@ e4c5 Ich habe den Beitrag bearbeitet und die Informationen hinzugefügt. Vielen Dank. – Navid777

Antwort

2

Zunächst einmal zu sagen, es ist ungenau,

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

Das liegt daran, dass

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

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

Dies wird durch die Tatsache bestätigt, dass der Fehler

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

Richtig ist, also wie wird die Testdatenbank erstellt? Basierend auf den Inhalten Ihrer Migrationen. Aber Sie haben

class Meta: 
     managed = False 
     db_table = 'company' 

Die managed = False hier bedeutet, dass keine Migration erstellt werden, so dass die Tabelle nicht in der Testdatenbank vorhanden sind. Daher der Fehler.

Lösung. Fügen Sie manuell eine Migration mit RunSQL hinzu, die diese Tabelle erstellt. Verwenden Sie dafür das SQL von SHOW CREATE TABLE company. Um das zu tun ersten

./manage.py makemigrations myapp --empty 

tun und die Bearbeitung der neu erstellte Migrationen Datei die RunPython oder RunSQL Code in es hinzuzufügen. Die SQL, die Sie in RunSQL übergeben, ist die SQL, die Sie in Ihrer MySQL-Konsole von SHOW CREATE TBABLE company generiert haben. Weitere Informationen und Beispiele finden Sie unter RunSQL Dokumente.

+0

Ich verstehe die Lösung nicht, was soll ich genau machen? Soll ich die Tabellen manuell erstellen? – Navid777