我正在使用pytest-django
在我的django
web服务器上运行一组测试。在travis上的testing/CI中,我试图从MySQL数据库服务器切换到MariaDB,为此,我还从mysqldb
python包切换到{
在使用MariaDB时,我突然发现了一个奇怪的异常,all我的数据库相关测试:
pymysql.err.InternalError: (1665, 'Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.')
在该作业的所有测试中,此异常位于多个异常的堆栈中,但我已将其确定为问题的根本原因。
需要注意的是,在直接在travis上运行测试套件的两个作业中,以及在docker(travis内部)上运行测试套件的两个作业中,只有一个失败,即运行在python3.6上的作业。在
虽然我大致了解问题的原因,但我没有找到很多关于突然触发/显现的具体细节或任何原因的信息。除了这个Django documentation issue。在
考虑到它只为python3测试任务触发,Django2放弃了对python2的支持,我假设这些问题是相关的,但我似乎仍然无法找到一个合理/体面的解决方案。我觉得我至少遗漏了这里发生的事情背后的一些原因/理由。在
我没有对数据库配置进行任何更改,所有服务都是使用内置安装运行的。在
作为参考,this是公关的一个travis工作,以防我错过了一些重要的东西。在
TL;DR:安装MariaDB的最新版本解决了这个问题。在
在阅读有关该问题的更多信息后,我能够确定根本原因确实是由于环境中两个默认配置之间的冲突:
BINLOG_FORMAT = STATEMENT
。在根据MariaDB's documentation,在10.2.4版本之前,这是MariaDB中的默认值。因为我使用的是Travis CI,并且由于using MariaDB on travisCI was documentedversion10.0是如何硬编码的,因此默认为上述值。
事务隔离级别设置为
READ COMMITTED
在Python3上,安装了Django>;=2.0,其中事务隔离级别根据Django's documentation设置为
READ COMMITTED
。这个配置似乎是一个更安全的默认值。替换示例travis mariadb片段中的主/次版本字符串:
使用主版本字符串
'10.3'
使travis安装了一个更为更新的版本或MariaDB,默认使用更灵活的BINLOG_FORMAT = MIXED
配置。在相关问题 更多 >
编程相关推荐