【问题标题】:how to connect to the django testing database correctly?如何正确连接到django测试数据库?
【发布时间】:2022-12-16 07:47:54
【问题描述】:

我有一个 Django 测试数据库的问题。

我使用这样的 setUp 方法:

def setUp(self):
    super().setUp()
    self.obj1 = MyModel.objects.create(name="name1")
    self.obj2 = MyModel.objects.create(name="name2")
    self.obj3 = MyModel.objects.create(name="name3")

但是当我尝试连接到测试数据库时:

import psycopg2
from psycopg2 import sql

db_uri = settings.DB_URI.replace("/db_name", "/test_db_name")
con = psycopg2.connect(db_uri)
cur = con.cursor()

并执行:

query = sql.SQL(
    "select * from {table};"
).format(
    table=sql.Identifier("mymodel_table_name"),
)
cur.execute(query)

print('result', cur.fetchall())

结果我看到了空列表。

但! 如果我在测试数据库中插入一些东西:

query = sql.SQL(
    "insert into {table} (id, name) values ({id}, {name});"
).format(
    table=sql.Identifier("mymodel_table_name"),
    id=sql.Literal(some_id),
    name=sql.Literal(some_name),
)
cur.execute(query)

当我执行时,我在 ORM 中看到它:

MyModel.objects.all()

我的目的是获取 test_db_name 所有对象,我将其插入到 setUp 方法中。

感谢您的任何帮助!

【问题讨论】:

  • 看起来您正在将数据插入生产数据库而不是测试数据库。这就是 ORM 能够打印值的原因,您可以尝试使用 pgadmin 登录 psql 并验证生产和测试数据库的内容吗?
  • @JayantSeth 抱歉,我忘了说清楚:我在 TestCase 中执行 MyModel.objects.all() 。
  • 即使在那种情况下它可能仍在使用生产数据库,请您使用 pgadmin 或 psql shell 来验证生产和测试数据库的内容。

标签: python django django-testing


【解决方案1】:

我只是遇到了完全相同的问题,原来我需要使用 TransactionTestCase 而不是 TestCase。

TransactionTestCase 和 TestCase 完全相同,只是方式不同 其中数据库被重置为已知状态和能力 测试提交和回滚效果的测试代码:

  • TransactionTestCase 通过截断所有表在测试运行后重置数据库。 TransactionTestCase 可以调用 commit 和 回滚并观察这些调用对数据库的影响。
  • 另一方面,测试用例不会在测试后截断表。相反,它将测试代码包含在数据库事务中 在测试结束时回滚。这保证了 测试结束时回滚将数据库恢复到初始状态 状态。

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 2013-05-07
    • 2017-11-26
    • 2011-10-17
    • 2023-02-17
    • 2021-06-23
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多