Django 测试 django.db.utils.ProgrammingError:(1146,“表 'DB.Table' 不存在”)

Posted

技术标签:

【中文标题】Django 测试 django.db.utils.ProgrammingError:(1146,“表 \'DB.Table\' 不存在”)【英文标题】:Django test django.db.utils.ProgrammingError: (1146, "Table 'DB.Table' doesn't exist")Django 测试 django.db.utils.ProgrammingError:(1146,“表 'DB.Table' 不存在”) 【发布时间】:2018-12-16 02:27:39 【问题描述】:

我在 Django 中运行一个简单的测试用例,我有一个模型订阅者但是当我运行 python manage.py test 它给了我以下错误

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_subscriber_fullname 
(gatpulsecore.tests.test_models.SubscribersTest)
Test method get_fullname
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\backends\mysql\base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\cursors.py", line 170, in execute
    result = self._query(query)
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\cursors.py", line 328, in _query
    conn.query(q)
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\connections.py", line 516, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\connections.py", line 727, in _read_query_result
    result.read()
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\connections.py", line 1066, in read
    first_packet = self.connection._read_packet()
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\connections.py", line 683, in _read_packet
    packet.check_error()
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "C:\Users\dania\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1146, "Table 'test_gatpulsedevinstance.subscribers' doesn't exist")

我的模型是这样的

from django.db import models

class Subscribers(models.Model):
    """ Subscriber Model """   
    idsubscribers = models.AutoField(primary_key=True)
    legalid = models.CharField(max_length=45, blank=True, null=True)
    name = models.CharField(max_length=45, blank=True, null=True)
    lastname = models.CharField(max_length=45, blank=True, null=True)
    initialdate = models.DateField(blank=True, null=True)
    bday = models.DateField(blank=True, null=True)
    email = models.CharField(max_length=100, blank=True, null=True)
    phone = models.CharField(max_length=45, blank=True, null=True)
    emergencyphone = models.CharField(max_length=45, blank=True, null=True)
    photolink = models.CharField(max_length=200, blank=True, null=True)
    medicalconditions = models.CharField(max_length=200, blank=True, null=True)
    objectives = models.CharField(max_length=200, blank=True, null=True)
    paymentfrequency = models.CharField(max_length=45, blank=True, null=True)

    def get_fullname(self):
        return self.name + " " + self.lastname
    class Meta:
        managed = False
        db_table = 'subscribers'

还有我的测试文件

from django.test import TransactionTestCase
from gatpulsecore.models import Subscribers

class SubscribersTest(TransactionTestCase):
    """ Test module for Subscribers model """

    def setUp(self):
        Subscribers.objects.create(
            legalid='34214555', name='Casper', lastname='Smith')
        Subscribers.objects.create(
            legalid='24612555', name='John', lastname='Rogers')

    def test_subscriber_fullname(self):
        """ Test method get_fullname """
        sub_casper = Subscribers.objects.get(name='Casper')
        sub_john = Subscribers.objects.get(name='John')
        self.assertEqual(
            sub_casper.get_fullname(), "Casper Smith")
        self.assertEqual(
            sub_john.get_fullname(), "John Rogers")

我已经尝试过迁移,但没有帮助,也有人建议使用 TransactionTestCase 而不是 TestCase,但它也不起作用。 有没有人遇到过同样的错误?我一直在寻找解决方法,但似乎没有找到任何有用的方法。

【问题讨论】:

【参考方案1】:

如果您使用多个数据库,则可能会发生这种情况,在这种情况下,您必须使用以下命令指定数据库:

MyModel.objects.using("database_name")

或者干脆将该特定数据库指定为主数据库。

据我了解,django 没有检测到您的数据库,或者您有多个数据库。

【讨论】:

我明白了,奇怪的是我在 settings.py 中只注册了一个数据库,并且指定数据库不起作用,谢谢

以上是关于Django 测试 django.db.utils.ProgrammingError:(1146,“表 'DB.Table' 不存在”)的主要内容,如果未能解决你的问题,请参考以下文章

django.db.utils.OperationalError:致命:角色“django”不存在

Django.db.utils.ProgramingError 关系不存在

解决“django.db.utils.ProgrammingError: 关系 django_migrations 的权限被拒绝”的步骤

Django.db.utils.ConnectionDoesNotExist:连接默认不存在

django.db.utils.OperationalError: (1046, '未选择数据库')

django.db.utils.ConnectionDoesNotExist:连接prueba不存在