2010-04-15 3 views
5

Ich führe einen Komponententest mit dem Django-Framework und bekomme diesen Fehler.ProgrammingError: (1146, "Tabelle 'test_ <DB>. <TABLE>' existiert nicht") beim Ausführen von Komponententest für Django

Das Ausführen des eigentlichen Codes hat dieses Problem nicht, das Ausführen der Unit-Tests erstellt eine Testdatenbank im laufenden Betrieb, so dass ich vermute, dass das Problem dort liegt.

Der Code, der den Fehler wirft wie folgt aussieht

member = Member.objects.get(email=email_address) 

und das Modell sieht aus wie

class Member(models.Model): 
    member_id = models.IntegerField(primary_key=True) 
    created_on = models.DateTimeField(editable=False, default=datetime.datetime.utcnow()) 
    flags = models.IntegerField(default=0) 
    email = models.CharField(max_length=150, blank=True) 
    phone = models.CharField(max_length=150, blank=True) 
    country_iso = models.CharField(max_length=6, blank=True) 
    location_id = models.IntegerField(null=True, blank=True) 
    facebook_uid = models.IntegerField(null=True, blank=True) 
    utc_offset = models.IntegerField(null=True, blank=True) 
    tokens = models.CharField(max_length=3000, blank=True) 
    class Meta: 
     db_table = u'member' 

gibt es nichts zu seltsam es ich sehen kann.

der Benutzer die Tests laufen die gleichen Berechtigungen für den Datenbankserver als Benutzer, der die Website

läuft

dies django 1.1 auf MariaDB auf osx läuft

MJ-2:mysite Marsh$ python manage.py test sitecoming 
Creating test database... 
Creating table django_content_type 
Creating table django_session 
Creating table django_site 
Creating table djangodblog_errorbatch 
Creating table djangodblog_error 
Installing index for djangodblog.ErrorBatch model 
Installing index for djangodblog.Error model 
E 
====================================================================== 
ERROR: test_index (mysite.sitecoming.tests.SiteComingTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/Marsh/Development/deal/src/mysite/sitecoming/tests.py", line 19, in test_index 
    response = c.post('/submit', {'email':'[email protected]'}) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/test/client.py", line 313, in post 
    response = self.request(**r) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/handlers/base.py", line 92, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "/Users/Marsh/Development/deal/src/mysite/sitecoming/views.py", line 49, in submit 
    member = Member.objects.get(email=email_address) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/manager.py", line 120, in get 
    return self.get_query_set().get(*args, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/query.py", line 300, in get 
    num = len(clone) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/query.py", line 81, in __len__ 
    self._result_cache = list(self.iterator()) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/query.py", line 238, in iterator 
    for row in self.query.results_iter(): 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/sql/query.py", line 287, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/sql/query.py", line 2369, in execute_sql 
    cursor.execute(sql, params) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 84, in execute 
    return self.cursor.execute(query, args) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-macosx-10.3-fat.egg/MySQLdb/cursors.py", line 173, in execute 
    self.errorhandler(self, exc, value) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-macosx-10.3-fat.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
ProgrammingError: (1146, "Table 'test_deal.member' doesn't exist") 

---------------------------------------------------------------------- 
Ran 1 test in 0.447s 

FAILED (errors=1) 
Destroying test database... 

wo sonst kann ich schauen sehen, was schief läuft, warum wird dieser Tisch nicht erstellt?

update - Das Problem scheint zu sein, dass beim Ausführen der Komponententests die Modelle, die zum Generieren der Testdatenbank verwendet werden, aus der Anwendung stammen und nicht aus dem Projekt. Das scheint ein seltsames Verhalten und eine Verletzung von DRY zu sein, damit ich die Modelldatei in jeder Anwendung anstatt zentral im Projekt kopieren muss.

kann jemand vorschlagen, wie man das umgeht?

** Update 2 ** - Projektstruktur sieht wie folgt aus:

Projektstruktur wie folgt aussieht:

/mysite (www.whatever.com) 
    /application1 (facebook app, handles all urls beginning with /fb) 
    /application2 (www app, handles everything else in the root dir of the site) 

i fb Funktionalität getrennt von dem Rest der Seite halten wollen, aber sie teilen die gleiche db. mache ich es falsch?

+0

Sie scheinen ein Missverständnis darüber zu haben, wo Modelle leben - sie * leben * in der Anwendung, nicht im "Projekt", das nur eine Sammlung von Apps mit einer Einstellungsdatei ist. Können Sie Ihre Projektstruktur posten? –

+0

Haben Sie definitiv das vollständige Modell für uns eingefügt? Du hast nicht etwas wie 'gemanaged = True' vergessen, oder? –

Antwort

9

um dieses Problem zu beheben erzeugen alle Ihre Tabelle, die in der settings.py Datei deklariert wurden Ihre Projektordner.

Sie können die in der INSTALLED APPS Block in der Einstellungsdatei finden. Für die Ausführung dieses Befehls:

manage.py syncdb oder python manage.py syncdb

Wenn dies nicht funktioniert, dann die Umgebungsvariable PATH für das Python-Verzeichnis festgelegt.

+0

Wie sind die Tabellen in der Einstellungsdatei definiert? –

+0

settings.py in INSTALLED_APPS? Ja wirklich? – LKM

+0

"syncdb" ist ab Django 1.8 veraltet. Bitte beziehen Sie sich auf diesen Beitrag http://stackoverflow.com/questions/27583744/django-table-doesnt-exist/27583836#27583836 –

3

Auf eine etwas andere Note, können Sie dies definitiv nicht wollen:

created_on = models.DateTimeField(…, default=datetime.datetime.utcnow()) 

Diese tatsächlich ruft utcnow() wenn Ihre models.py-Datei geladen wird (was passieren wird, wenn Sie manage.py runserver) und dass die einzelnen Zeitpunkt verwenden für der Standardwert für jede nachfolgende Instanz. Was Sie wollen, ist dies:

created_on = models.DateTimeField(…, default=datetime.datetime.utcnow) 

Das default Argument eine aufrufbare annehmen kann, die jedes Mal, wenn der Standardwert für eine neue Instanz benötigt wird, aufgerufen werden. Werfen Sie einen Blick auf die documentation.

2

Sie können mehr Informationen bekommen, was los ist -v3 zu Ihrem Test hinzufügen, das heißt:

$ python manage.py test -v3 sitecoming 
Verwandte Themen