如何在 Django Pytests 中使用游标查询其他数据库
How to query additional databases using cursor in Django Pytests
我正在开发 Django 应用程序(Django v3.2.10、pytest v7.0.1、pytest-django v4.5.2),它使用游标对我的辅助数据库执行原始查询:my_db2,但是当 运行 测试时,所有查询 return 空结果,就像它们 运行 并行交易一样。
我的测试文件:
@pytest.mark.django_db(transaction=True, databases=['default', 'my_db2'])
class TestItems:
def test_people(self):
person1 = PeopleFactory() # Adds 1 person to my_db2
assert fetch_all_persons() == 1 # Fails Returns 0
我的工厂:
class PeopleFactory(factory.django.DjangoModelFactory):
id = factory.Sequence(lambda x: x + 1)
name = factory.Faker('first_name')
class Meta:
model = People
我的函数:
from django.db import connections
def fetch_all_persons():
with connections['my_db2'].cursor() as cursor:
cursor.execute(f"SELECT * FROM Persons")
return len(list(cursor.fetchall())):
According documentation transaction=True
应该可以防止这个问题,但没有,有人知道如何解决吗?
注意。- 使用 ORM 不是一个选项,这只是一个表示问题的简化示例。实际使用的查询要复杂得多。
@hoefling 和@Arkadiusz Łukasiewicz 是对的,我只需要在工厂中添加相应的数据库即可:
class PeopleFactory(factory.django.DjangoModelFactory):
id = factory.Sequence(lambda x: x + 1)
name = factory.Faker('first_name')
class Meta:
model = People
database = 'my_db2'
谢谢你们。
我正在开发 Django 应用程序(Django v3.2.10、pytest v7.0.1、pytest-django v4.5.2),它使用游标对我的辅助数据库执行原始查询:my_db2,但是当 运行 测试时,所有查询 return 空结果,就像它们 运行 并行交易一样。
我的测试文件:
@pytest.mark.django_db(transaction=True, databases=['default', 'my_db2'])
class TestItems:
def test_people(self):
person1 = PeopleFactory() # Adds 1 person to my_db2
assert fetch_all_persons() == 1 # Fails Returns 0
我的工厂:
class PeopleFactory(factory.django.DjangoModelFactory):
id = factory.Sequence(lambda x: x + 1)
name = factory.Faker('first_name')
class Meta:
model = People
我的函数:
from django.db import connections
def fetch_all_persons():
with connections['my_db2'].cursor() as cursor:
cursor.execute(f"SELECT * FROM Persons")
return len(list(cursor.fetchall())):
According documentation transaction=True
应该可以防止这个问题,但没有,有人知道如何解决吗?
注意。- 使用 ORM 不是一个选项,这只是一个表示问题的简化示例。实际使用的查询要复杂得多。
@hoefling 和@Arkadiusz Łukasiewicz 是对的,我只需要在工厂中添加相应的数据库即可:
class PeopleFactory(factory.django.DjangoModelFactory):
id = factory.Sequence(lambda x: x + 1)
name = factory.Faker('first_name')
class Meta:
model = People
database = 'my_db2'
谢谢你们。