djnago-pytest无法创建测试数据库

时间:2020-10-13 05:14:37

标签: python python-3.x django django-rest-framework

我正在集成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”,并且在未创建其余表并执行测试用例的情况下引发了错误。

0 个答案:

没有答案
相关问题