代码之家  ›  专栏  ›  技术社区  ›  Scott Skiles

Django connections对象在使用pytest Django进行测试期间看不到第二个数据库的表

  •  9
  • Scott Skiles  · 技术社区  · 6 年前

    底线: 在使用pytest Django进行测试期间,我的Django connections对象看不到第二个数据库的表关系。

    概述: 我有一个问题,Django connections对象似乎获取了错误的数据库信息。我在查询“客户”数据库中的一个表时偶然发现了这个问题,Django告诉我这个关系不存在。使用设置。py数据库部分的设置如下:

    DATABASES = {
        'default': {
            'NAME': 'user_data',
            'ENGINE': 'django.db.backends.postgres',
            'USER': 'postgres_1',
            'PASSWORD': 'superS3cret'
        },
        'customers': {
            'NAME': 'customer_data',
            'ENGINE': 'django.db.backends.postgres',
            'USER': 'postgres_1',
            'PASSWORD': 'superS3cret'
        }
    }
    

    当我在目录上运行“pytest”时,下面的两个游标都从“default”数据库中获取信息:

    sql = """SELECT table_name FROM information_schema.tables WHERE table_nameschema='public'"""
    
    default = connections["default"].cursor()
    default.execute(sql)
    raw_data = default.fetchall()
    sql_columns = [col[0] for col in default.description]
    df1 = pd.DataFrame(raw_data, columns=sql_columns)
    
    customers = connections["customers"].cursor()
    customers.execute(sql)
    raw_data = customers.fetchall()
    sql_columns = [col[0] for col in customers.description]
    df2 = pd.DataFrame(raw_data, columns=sql_columns)
    

    df1和df2的结果完全相同:只有“default”数据库中的表名。

    使用pytest django和第二个Postgres数据库, 但只是有时候

    在上面的查询中,我希望df1和df2是不同的,因为“默认”和“客户”数据库是不同的。但是,有时,connections游标无法正确地“查看”第二个数据库中的所有信息。

    奇怪的是,当我打印时,连接设置的显示方式不同:

    print(connections.databases)
    

    “connections”对象包含两个不同的DB,但其中一个是“test”DB。print语句生成一个字典,但请注意“ test\u客户 “:

    (pdb) { 'default': { <conn info>}, 'test_customers': { <conn info> } }
    

    Django似乎正在尝试建立一个测试数据库,但失败了,并且没有通过测试,因为“test\u customers”中的表与生产中的表不同。

    我如何解决这个问题,以便pytest django在测试期间始终可以看到第二个数据库(客户)中的表?数据库的设置和拆卸是否有问题?

    使现代化 :正在读取 pytest-django docs on DB creation/re-use 为我指明了正确的方向。然而,我对文档的这一部分感到有点不安:

    目前pytest django并不专门支持django 多数据库支持。然而,您可以使用普通的Django测试用例 实例以使用其multi\u db支持。

    如果您对支持多个数据库的最佳API有任何想法 请直接联系pytest django,我们对 最终支持这一点,但不确定是否只关注Django 方法

    2 回复  |  直到 6 年前
        1
  •  3
  •   illagrenan Luper Rouch    6 年前

    pytest-django does not support multiple databases .当我在试验多个数据库和参数时 --reuse-db / --create-db 结果是,有时它可以工作(所有数据库都已创建并且可以正确使用),有时它不工作(要么数据库未创建,要么Django抱怨数据库已经存在)。

    IMHO有两种选择: (1) 不要将pytest与Django一起使用; (2) 简化测试,这样就不需要多个数据库。对于选项2),我正在使用此设置:

    典型的 settings :

    DATABASES = {
        'default': ...,
        'secondary': ...,
    }
    

    pytest.ini :

    [pytest]
    ...
    DJANGO_SETTINGS_MODULE=my_app.settings.test
    ...
    

    test.py :

    # Import all from normal settings
    from .base import *
    
    DATABASES.pop('secondary')
    # This will route all queries and migrations to the default DB
    DATABASE_ROUTERS = []
    
        2
  •  0
  •   Feliks Yaretskiy    5 年前

    在test\u设置中。py->猴子补丁

    from django.db.models.query import QuerySet, RawQuerySet
    queryset_using = QuerySet.using
    raw_queryset_using = RawQuerySet.using
    
    
    def new_queryset_using(self, alias):
        return queryset_using(self, 'default')
    
    
    def new_raw_queryset_using(self, alias):
        return raw_queryset_using(self, 'default')
    
    
    QuerySet.using = new_queryset_using
    RawQuerySet.using = new_raw_queryset_using