保存到线程内的数据库

2024-10-05 10:49:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我和django一起工作

我有一个线程,其目的是获取数据库项的排队列表并修改它们

这是我的模型:

class MyModel(models.Model):
    boolean = models.BooleanField(editable=False)

以及有问题的代码:

def unqueue():
    while not queue.empty():
        myList = queue.get()
        for i in myList:
            if not i.boolean:
                break
            i.boolean = False
            i.save()   # <== error because database table is locked
        queue.task_done()


queue = Queue()

thread = Thread(target=unqueue)
thread.start()

def addToQueue(pk_list): # can be called multiple times simultaneously
    list = []
    for pk in pk_list:
        list.append(MyModel.objects.get(pk=pk))
    queue.put(list)

我现在的代码是失踪的检查等很多。。。我在这里简化了,让它更清楚

在线程中,我可以做些什么来保存到我的数据库中?你知道吗

EDIT:我需要同步,因为I.boolean(以及我实际代码中的其他属性)不能被覆盖

我试图在数据库中创建一个专用表,但没有成功,我仍然有相同的问题

编辑2:我应该明确指出我使用的是SQLite3。我试着看看是否可以在SQLite中解锁/锁定特定的表,似乎锁定只适用于整个db。这可能就是为什么使用专用表没有帮助。你知道吗

这对我来说很糟糕,因为我需要从不同的线程同时访问不同的表,有可能吗?你知道吗

编辑3:看来我的问题就是这里列出的问题 https://docs.djangoproject.com/en/1.8/ref/databases/#database-is-locked-errors


Tags: 代码数据库falsequeuemodelsdefnot线程
2条回答

您确定需要同步队列吗?可能异步解决方案会解决您的问题吗?Need a thread-safe asynchronous message queue

我找到的解决办法是改变数据库

SQLite不允许这样的并发访问。你知道吗

我切换到MySql,现在它可以工作了

相关问题 更多 >

    热门问题