gpt4 book ai didi

python - Django/sqlite3 "OperationalError: no such table"线程操作

转载 作者:IT王子 更新时间:2023-10-29 06:26:11 26 4
gpt4 key购买 nike

根据我在文档中阅读的所有内容,Django 和 py-sqlite3 都应该适用于线程访问。 (对吗?)但是这段代码片段对我来说失败了。主线程中的操作有效,但在我创建的线程中无效。我得到:

File "C:\Python27\lib\site-packages\django-1.9-py2.7.egg\django\db\backends\sq lite3\base.py", line 323, in execute return Database.Cursor.execute(self, query, params)

OperationalError: no such table: thrtest_mymodel

有什么问题?

我如何才能准确追踪 Django 的补丁或修复它所必需的一切? Django 中的失败点非常吓人。我不知道如何查看它确实看到了哪些表,或者在主线程和其他线程之间寻找哪些差异。

from django.db import models

# Super-simple model
class MyModel(models.Model):
message = models.CharField('Message', max_length=200, blank=True)

#Test
from django.test import TestCase

import time
import threading
import random


done = threading.Event()
nThreads = 1


def InsertRec(msg):
rec = MyModel.objects.create(message=msg)
rec.save()


def InsertThread():
try:
msgNum = 1
thrName = threading.currentThread().name
print 'Starting %s' % thrName
while not done.wait(random.random() * 0.1):
msgNum += 1
msg = '%s: %d' % (thrName, msgNum)
print msg
InsertRec(msg)
finally:
done.set()
pass


class ThreadTestRun(TestCase):

def testRunIt(self):
nThisThread = 10
msgSet = set()
for x in xrange(nThisThread):
msg = 'Some message %d' % x
InsertRec(msg) # From main thread: works!
msgSet.add(msg)
self.assertEqual(MyModel.objects.count(), nThisThread)
# We use sets because .all() doesn't preserve the original order.
self.assertEqual(msgSet, set([r.message for r in MyModel.objects.all()]))
thrSet = set()
for thrNum in xrange(nThreads):
t = threading.Thread(name='Thread %d' % thrNum, target=InsertThread)
t.start()
thrSet.add(t)

done.wait(10.)
done.set()
for t in thrSet:
t.join()

更新:这是来自 settings.py 的数据库:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:', # os.path.join(BASE_DIR, 'db.sqlite3'),
'TEST_NAME' : ':memory:',
},
}

更新:关于 D​​jango 的票 #12118,我使用 ':memory:' 或磁盘文件(对于 TEST_NAME).

Django 1.9,Python 2.7.11。 (在 Django 1.6 中有相同的症状。)

最佳答案

像这样更改您的DATABASES:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
'TEST' :
{
'NAME': 'test_db',
}
},
}

这将强制 django 在磁盘上创建一个真正的 sqlite 数据库,而不是在内存中创建它。

还要确保从 django.test.testcases.TransactionTestCase 继承与线程相关的测试用例。如果不这样做,线程将看不到其他线程对数据库所做的更改。

关于python - Django/sqlite3 "OperationalError: no such table"线程操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34658231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com