【发布时间】:2019-12-19 05:52:10
【问题描述】:
今天,我接手了一个朋友的项目,让我大吃一惊。当尝试写入远程 MySQL 数据库时,它吐出这个错误:
peewee.OperationalError: (2014, 'Command Out of Sync')
仔细观察,程序仅在初始化阶段运行 connect() 到数据库,并且仅在程序退出时运行 close()。然而,这是一个多处理 Python 应用程序,它通常一次执行大约 4 个进程,每个进程读取和写入我们的数据库。
根据我之前使用 MySQL 的经验,以及对这个特定错误的研究,这似乎是在两条语句同时执行时发生的。因此,需要对方法进行一些重写。
大多数方法都包含在与数据库交互的类中,例如:
Class Foo
...
def register_foo(self) -> Foo:
saved = False
attempts = 0
while not saved:
if attempts >= 20:
print('error: could not register foo!')
return None
try:
foo, created = Foo.get_or_create()
except Exception as e:
print(e)
sleep(2.5)
attempts += 1
continue
saved = True
return foo
这似乎根本不对。我想它有时可以解决这个问题,但我更愿意通过同步到数据库来解决这个问题。
我的问题是分割 Python3 脚本的 peewee 方法以便在写入远程数据库时不会出现同步问题的正确方法是什么?
【问题讨论】:
-
刚刚在 peewee github 中找到了一个可以工作的 mixin 类 ReconnectMixin。来源:github.com/coleifer/peewee/blob/master/playhouse/shortcuts.py
标签: python mysql peewee pymysql