django默认隔离级别和db二进制日志格式错误

4jb9z9bj  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(265)

我正在我的电脑上做一系列测试 django Web服务器使用 pytest-django . 在travis上的testing/ci中,我试图从mysql数据库服务器切换到mariadb,为此我还从 mysqldb python包到 pymysql .
在使用mariadb时,我突然发现所有与数据库相关的测试都出现了一个奇怪的异常:
pymysql.err.internalerror:(1665,'cannot execute statement:无法写入二进制日志,因为binlog\u format=statement,并且至少有一个表使用限制为基于行的日志的存储引擎。当事务隔离级别为read committed或read uncommitted时,innodb仅限于行日志记录。“)
下面是该作业所有测试中几个异常的堆栈,但我已将其确定为问题的根本原因。
需要注意的是,在两个直接在travis上运行测试套件的作业和另一个在docker(travis内部)上运行测试套件的作业中,只有一个失败,即在Python3.6上运行的作业。
虽然我大致了解了问题的原因,但我找不到很多关于细节的信息,也找不到它突然触发/显现的任何原因。除了这个django文件问题。
考虑到它只在python3测试作业中触发,而django2放弃了对python2的支持,我假设这些问题是相关的,但是我仍然无法找到一个合理/体面的解决方案。我觉得我至少遗漏了这里发生的事情背后的一些原因/原因。
我没有对数据库配置做任何更改,所有服务都是用内置安装运行的。
作为参考,这是公关部的工作,以防我遗漏了一些重要的事情。

dbf7pr2w

dbf7pr2w1#

热释光;dr:安装mariadb的最新版本解决了这个问题。
通过阅读更多关于这个问题的内容,我能够确定根本原因确实是由于我的环境中两个默认配置之间的冲突: BINLOG_FORMAT = STATEMENT .
根据mariadb的文档,在版本10.2.4之前,这是mariadb的默认设置。因为我使用的是travis ci,也因为在travisci上使用mariadb是有文档记录的,所以版本10.0是硬编码的,因此默认为上面的值。
事务隔离级别设置为 READ COMMITTED 在python3上,安装了django>=2.0,其中事务隔离级别设置为 READ COMMITTED 根据django的文件。此配置似乎是一个更安全的默认值。
替换示例travis mariadb代码段中的主要/次要版本字符串:

addons:
  - mariadb: '10.0'

只有主要版本的字符串 '10.3' 使travis安装了一个更为更新的版本或mariadb,默认为更灵活的版本 BINLOG_FORMAT = MIXED 配置。

m4pnthwp

m4pnthwp2#


# config as this way, add options

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxx',
        'USER': 'xx',
        'PASSWORD': 'xx',
        'HOST': 'xxx',
        'POST': 'xxx',
        'OPTIONS': {
            'isolation_level': "repeatable read"
        },
    },
}

相关问题