Python 围绕SQLite开展工作';s缺少命名参数支持
Django关于使用命名参数的文档说明如下: SQLite后端不支持字典参数;使用此后端,必须以列表形式传递参数 我在我们的代码库中运行单元测试时使用SQLite,因为它比我们真正的数据库后端快得离谱。但由于它似乎不支持命名参数,我无法为依赖它们的特定功能编写测试 是否有一个干净的通用方法来解决这个限制?如中所述,不诉诸可能使代码暴露于SQL注入的黑客手段 我在代码库中运行单元测试时使用SQLite,因为它是 与我们真正的数据库后端相比,速度快得离谱 理想情况下,单元测试应该针对同一个数据库执行。sqlite缺少许多特性(正如您所发现的)。如果您将测试编码为与sqlite一起使用,那么最终可能会将您的函数编码为与sqlite一起使用,这意味着您的真实数据库上的一些功能刚刚变得多余 通过使用,您可以使针对mysql或postgresql的测试运行得更快。因此,实际上不需要使用sqlite进行测试 是否有一个干净的通用方法来解决这个限制?如:, 而不诉诸可能使代码暴露于SQL注入的黑客Python 围绕SQLite开展工作';s缺少命名参数支持,python,django,sqlite,django-testing,Python,Django,Sqlite,Django Testing,Django关于使用命名参数的文档说明如下: SQLite后端不支持字典参数;使用此后端,必须以列表形式传递参数 我在我们的代码库中运行单元测试时使用SQLite,因为它比我们真正的数据库后端快得离谱。但由于它似乎不支持命名参数,我无法为依赖它们的特定功能编写测试 是否有一个干净的通用方法来解决这个限制?如中所述,不诉诸可能使代码暴露于SQL注入的黑客手段 我在代码库中运行单元测试时使用SQLite,因为它是 与我们真正的数据库后端相比,速度快得离谱 理想情况下,单元测试应该针对同一个数据库执行
不。我想说,使用sqlite而不是真正的数据库一开始就是一种黑客行为。sqlite本身支持(除了
qmark
和numeric
之外,它还支持命名为),但Django的sqlite后端没有实现从其自身参数格式的正确转换。从理论上讲,这一点可以在以后的版本中改变。对于未来的访问者:我最终通过删除原始SQL语句将代码重写为与数据库无关的代码。e4c5在下面仍然提出了一个有效的观点,因此我将他们的帖子标记为答案。您尝试过了吗?在单元测试中重用旧数据库表似乎是在独立的测试运行中进行状态泄漏的好方法,这使得测试的行为不可预测。我们有一个包含2000多个测试和大量表的代码库,因此在重用旧数据库时存在很大的潜在干扰。我是否误解了——keep
?是的,彼得,你误解了它。测试套件完成后,数据库将恢复到其原始状态。您的意思是在抛出数据时保留方案?正是这样。有关更多详细信息,请参阅链接答案