gpt4 book ai didi

python - sqlite3操作在快速执行多次提交时出错

转载 作者:行者123 更新时间:2023-12-03 17:56:03 24 4
gpt4 key购买 nike

我懂了

sqlite3.OperationalError: SQL logic error or missing database


当我运行一个应用程序时,我一直在努力。接下来是一个缩小但完整的示例,它为我展示了问题。该示例使用两个表。一个用于存储用户,另一个用于记录用户信息是否在外部目录系统中是最新的。 (您可以想象,在我的实际应用程序中,这些表要长得多)。该示例创建了一堆随机用户,然后遍历(随机)用户列表并将其添加到第二个表中。

#!/usr/bin/env python

import sqlite3
import random

def random_username():
# Returns one of 10 000 four-letter placeholders for a username
seq = 'abcdefghij'
return random.choice(seq) + random.choice(seq) + \
random.choice(seq) + random.choice(seq)

connection = sqlite3.connect("test.sqlite")

connection.execute('''CREATE TABLE IF NOT EXISTS "users" (
"entry_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
"user_id" INTEGER NOT NULL ,
"obfuscated_name" TEXT NOT NULL)''')
connection.execute('''CREATE TABLE IF NOT EXISTS "dir_x_user" (
"user_id" INTEGER PRIMARY KEY NOT NULL)''')

# Create a bunch of random users
random.seed(0) # get the same results every time
for i in xrange(1500):
connection.execute('''INSERT INTO users
(user_id, obfuscated_name) VALUES (?, ?)''',
(i, random_username()))
connection.commit()

#random.seed()
for i in xrange(4000):
username = random_username()
result = connection.execute(
'SELECT user_id FROM users WHERE obfuscated_name = ?',
(username, ))
row = result.fetchone()
if row is not None:
user_id = row[0]
print " %4d %s" % (user_id, username)
connection.execute(
'INSERT OR IGNORE INTO dir_x_user (user_id) VALUES(?)',
(user_id, ))
else:
print " ? %s" % username
if i % 10 == 0:
print "i = %s; committing" % i
connection.commit()
connection.commit()


特别要注意的是,靠近末端的那条线说:

if i % 10 == 0:


在实际的应用程序中,我正在从网络资源中查询数据,并希望不时地提交用户。发生错误时,更改该行会发生更改;看来我提交时,OperationalError的机会不为零。这似乎与我放入数据库中的数据有关,但是我无法确定问题出在哪里。

在大多数情况下,如果我读取所有数据然后仅提交一次,则不会发生错误。 [是的,那里有一个明显的解决方法,但是潜在的问题仍然存在。]

这是我的计算机上运行的示例的结尾:

     ? cgha
i = 530; committing
? gegh
? aabd
? efhe
? jhji
? hejd
? biei
? eiaa
? eiib
? bgbf
759 bedd
i = 540; committing
Traceback (most recent call last):
File "sqlitetest.py", line 46, in <module>
connection.commit()
sqlite3.OperationalError: SQL logic error or missing database


我正在将Mac OS X 10.5.8与内置的Python 2.5.1和Sqlite3 3.4.0一起使用。

最佳答案

顾名思义,“ lite”部分表示,sqlite3用于轻量级数据库,而不是像Big Boys这样的大规模可伸缩并发。在我看来,这里发生的是,当您再次发出请求时,sqlite尚未完成编写您所请求的最后一个更改

因此,我为您提供的一些选择是:


您可能会花费大量时间来学习file locking, concurrency, and transaction in sqlite3
this Reddit post上的某些建议所示,您可以通过让您的应用在第一次失败后重试操作来添加更多的防错功能,其中包括“例如,如果代码具有有效的简单重试机制,则大多数sqlite的并发性问题消失了”和“通过isolation_level =无连接似乎可以解决”。
您可以切换到使用更具扩展性的数据库,例如PostgreSQL


(以我的金钱,第二或第三是要走的路。)

关于python - sqlite3操作在快速执行多次提交时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1610154/

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