关于MySQL的Django:如何启用自动提交?

ipa*_*ola 4 mysql django transactions django-models

我有类似下面的代码在后台进程中运行:

def run()
    while True:
        objs = MyModel.objects.filter(last_updated < time.time() - FREQUENCY)
        print objs

def update()
    while True:
       # some processing code
       mymodel.last_updated = time.time()
       mymodel.save()
Run Code Online (Sandbox Code Playgroud)

上述函数在两个独立的线程中运行:update()依次更新所有模型,而run()选择需要更新的模型.这一切都针对MySQL运行,而MyModel则存在于InnoDB表中.

问题是run()总是看到last_updated的相同值.原因是它位于事务内部并选择数据的一致快照.当然,我希望它选择最新的数据.如果我执行以下操作,它可以工作:

def run()
    from django.db import connection
    while True:
        connection.connection.execute('SET autocommit = 1')
        objs = MyModel.objects.filter(last_updated < time.time() - FREQUENCY)
        print objs
Run Code Online (Sandbox Code Playgroud)

但这意味着我将每次执行一次额外的查询.最重要的是,如果连接在我设置autocommit = 1和下面的select之间关闭,它将无法工作.

Postgres很乐意支持这个:http://docs.djangoproject.com/en/dev/ref/databases/#autocommit-mode(至少根据文档),但是有没有办法为MySQL启用自动提交?

此外,由于它作为后台进程运行,因此不会处理任何请求,也不会涉及中间件.

小智 5

在Django中,我监听connection_created信号,一旦建立连接就发送"set autocommit = 1"语句.它工作正常!

from django.db.backends.signals import connection_created
from django.dispatch import receiver

@receiver(connection_created)
def connection_init(sender, connection, **kwargv):
    connection.cursor().execute("SET autocommit=1")
Run Code Online (Sandbox Code Playgroud)