python sqlite3 no such table_python – 关于线程操作的Django / sqlite3“OperationalError:no such table”...

在Django 1.9中遇到使用SQLite3进行线程操作时出现'OperationalError: no such table'的问题。主线程操作正常,但线程中创建表失败。尝试使用'in-memory'数据库配置,问题依旧。寻求解决方案来跟踪Django内部行为或修复错误。
摘要由CSDN通过智能技术生成

通过我在文档中阅读的所有内容,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:

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': ':memory:', # os.path.join(BASE_DIR, 'db.sqlite3'),

'TEST_NAME' : ':memory:',

},

}

更新:关于Django的票#12118,我使用’:memory:’或磁盘文件(对于TEST_NAME)得到相同的症状.

Django 1.9,Python 2.7.11. (Django 1.6中的症状相同.)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值