我正在集成django-pytest并为此编写了第一个测试用例,但是在运行pytest时,它仅创建5个表后便开始创建测试数据库并引发错误“无法添加外键约束”。 下面是堆栈跟踪
query = b'ALTER TABLE `tracking_invoiceview` ADD CONSTRAINT `tracking_invoiceview_invoice_id_95b70617_fk_backend_invoices_id` FOREIGN KEY (`invoice_id`) REFERENCES `backend_invoices` (`id`)'
def query(self, query):
# Since _mysql releases GIL while querying, we need immutable buffer.
if isinstance(query, bytearray):
query = bytes(query)
if self.waiter is not None:
self.send_query(query)
self.waiter(self.fileno())
self.read_query_result()
else:
> _mysql.connection.query(self, query)
E _mysql_exceptions.IntegrityError: (1215, 'Cannot add foreign key constraint')
cheetah_env/lib/python3.6/site-packages/MySQLdb/connections.py:276: IntegrityError
The above exception was the direct cause of the following exception:
request = <SubRequest '_django_db_marker' for <Function test_login>>
@pytest.fixture(autouse=True)
def _django_db_marker(request):
"""Implement the django_db marker, internal to pytest-django.
This will dynamically request the ``db``, ``transactional_db`` or
``django_db_reset_sequences`` fixtures as required by the django_db marker.
"""
marker = request.node.get_closest_marker("django_db")
if marker:
transaction, reset_sequences = validate_django_db(marker)
if reset_sequences:
request.getfixturevalue("django_db_reset_sequences")
elif transaction:
request.getfixturevalue("transactional_db")
else:
> request.getfixturevalue("db")
cheetah_env/lib/python3.6/site-packages/pytest_django/plugin.py:513:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cheetah_env/lib/python3.6/site-packages/pytest_django/fixtures.py:108: in django_db_setup
**setup_databases_args
cheetah_env/lib/python3.6/site-packages/django/test/utils.py:174: in setup_databases
serialize=connection.settings_dict.get('TEST', {}).get('SERIALIZE', True),
cheetah_env/lib/python3.6/site-packages/django/db/backends/base/creation.py:68: in create_test_db
run_syncdb=True,
cheetah_env/lib/python3.6/site-packages/django/core/management/__init__.py:148: in call_command
return command.execute(*args, **defaults)
cheetah_env/lib/python3.6/site-packages/django/core/management/base.py:353: in execute
output = self.handle(*args, **options)
cheetah_env/lib/python3.6/site-packages/django/core/management/base.py:83: in wrapped
res = handle_func(*args, **kwargs)
cheetah_env/lib/python3.6/site-packages/django/core/management/commands/migrate.py:172: in handle
self.sync_apps(connection, executor.loader.unmigrated_apps)
cheetah_env/lib/python3.6/site-packages/django/core/management/commands/migrate.py:310: in sync_apps
self.stdout.write(" Running deferred SQL...\n")
cheetah_env/lib/python3.6/site-packages/django/db/backends/base/schema.py:106: in __exit__
self.execute(sql)
cheetah_env/lib/python3.6/site-packages/django/db/backends/base/schema.py:133: in execute
cursor.execute(sql, params)
cheetah_env/lib/python3.6/site-packages/django/db/backends/utils.py:68: in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
cheetah_env/lib/python3.6/site-packages/django/db/backends/utils.py:77: in _execute_with_wrappers
return executor(sql, params, many, context)
cheetah_env/lib/python3.6/site-packages/django/db/backends/utils.py:85: in _execute
return self.cursor.execute(sql, params)
cheetah_env/lib/python3.6/site-packages/django/db/utils.py:89: in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
cheetah_env/lib/python3.6/site-packages/django/db/backends/utils.py:85: in _execute
return self.cursor.execute(sql, params)
cheetah_env/lib/python3.6/site-packages/django/db/backends/mysql/base.py:71: in execute
return self.cursor.execute(query, args)
cheetah_env/lib/python3.6/site-packages/MySQLdb/cursors.py:250: in execute
self.errorhandler(self, exc, value)
cheetah_env/lib/python3.6/site-packages/MySQLdb/connections.py:50: in defaulterrorhandler
raise errorvalue
cheetah_env/lib/python3.6/site-packages/MySQLdb/cursors.py:247: in execute
res = self._query(query)
cheetah_env/lib/python3.6/site-packages/MySQLdb/cursors.py:412: in _query
rowcount = self._do_query(q)
cheetah_env/lib/python3.6/site-packages/MySQLdb/cursors.py:375: in _do_query
db.query(q)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <_mysql.connection open to 'localhost' at 34e6918>
query = b'ALTER TABLE `tracking_invoiceview` ADD CONSTRAINT `tracking_invoiceview_invoice_id_95b70617_fk_backend_invoices_id` FOREIGN KEY (`invoice_id`) REFERENCES `backend_invoices` (`id`)'
def query(self, query):
# Since _mysql releases GIL while querying, we need immutable buffer.
if isinstance(query, bytearray):
query = bytes(query)
if self.waiter is not None:
self.send_query(query)
self.waiter(self.fileno())
self.read_query_result()
else:
> _mysql.connection.query(self, query)
E django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')
cheetah_env/lib/python3.6/site-packages/MySQLdb/connections.py:276: IntegrityError
---------------------------- Captured stderr setup -----------------------------
Got an error creating the test database: (1007, "Can't create database 'test_izenda_app_by_migrate'; database exists")
--------------- generated xml file: /tmp/tmp-6908YWZwoNZB5NF.xml ---------------
=========================== short test summary info ============================
ERROR tests/test_accounts.py::test_login - django.db.utils.IntegrityError: (1...
=============================== 1 error in 9.35s ===============================
在签入数据库时,创建了“ tracking_invoiceview”表,但未创建所引用的第二个表“ backend_invoices”,并且在未创建其余表并执行测试用例的情况下引发了错误。