代码之家  ›  专栏  ›  技术社区  ›  James Lin

测试中的Django外部MySQL DB连接投诉“未知数据库”

  •  0
  • James Lin  · 技术社区  · 6 年前

    在我的django项目中,我有几个数据库连接:

    如。

    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.postgresql_psycopg2",
            "NAME": "awesome",
            ...
        },
        "other_1": {
            "ENGINE": "django.db.backends.postgresql_psycopg2",
            "NAME": "other_1",
            "TEST": {"MIRROR": default}
            ...
        },
        "other_2": {
            "ENGINE": "django.db.backends.mysql",
            "NAME": "other_2",
            "TEST": {"MIRROR": default}
        }
    }
    

    注:

    1. 这个 default other_1 两者都是 postgres 后端和 other_2 mysql 后端。
    2. 我补充说 "TEST": {"MIRROR": default} 以避免在测试期间创建这些数据库。看到这个 link .

    问题:

    当我运行测试时,它会抱怨 Unknown database 'test_awesome' ,堆栈跟踪显示它来自mysql后端:

    Traceback (most recent call last):
      File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/django/test/testcases.py", line 1005, in setUpClass
        if not connections_support_transactions():
      File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/django/test/testcases.py", line 970, in connections_support_transactions
    ...
    File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/MySQLdb/__init__.py", line 85, in Connect
        return Connection(*args, **kwargs)
      File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/MySQLdb/connections.py", line 204, in __init__
        super(Connection, self).__init__(*args, **kwargs2)
    django.db.utils.OperationalError: (1049, "Unknown database 'test_awesome'")
    

    如果我把 其他2 连接,测试运行正常。

    1 回复  |  直到 6 年前
        1
  •  0
  •   James Lin    6 年前

    看起来问题是因为有后台?

    我深入调查了 setup_database code ,如果我删除 other_2 mirrored_aliases dict,那么我的测试代码就可以正常工作了。

    所以我创建了一个测试运行程序类来删除 其他2 连接,因为它太深,无法从中删除 mirriored_aliases .

    class TestRunner(DiscoverRunner):
        def setup_databases(self, **kwargs):
            # to get around this problem
            # https://stackoverflow.com/questions/54189925/django-external-mysql-db-connection-in-test-complains-unknown-database
            settings.DATABASES.pop('other_2', None)
            return super(TestRunner, self).setup_databases(**kwargs)
    
    推荐文章