我有一个服务器,允许(管理员)创建,删除或编辑其他用户的详细信息, 我已经在函数内的游标旁边创建了数据库:
def DBSetup():
global schoolDBConn, schoolDBCursor
print("Setting up databases")
schoolDBConn = sqlite3.connect("SCHOOL_DB.db")
schoolDBCursor = schoolDBConn.cursor()
schoolDBCursor.execute(
"""
CREATE TABLE IF NOT EXISTS USER_DETAILS
(
username text,
password text,
clearance int,
classes int
)
"""
)
schoolDBCursor.execute( #line 300
"""
CREATE TABLE IF NOT EXISTS CLASSES
(
className text,
supervisor text,
assignmentName text
)
"""
)
schoolDBCursor.execute(
"""
CREATE TABLE IF NOT EXISTS ASSIGNMENT
(
setDate text,
dueDate text,
assignmentInfo text,
supervisor text
)
"""
)
我在服务器启动时调用它,然后我开始线程:
if __name__ == "__main__":
DBSetup()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)
while True:
conn, addr = s.accept()
connThread = Thread(target=handler, args=(conn, addr))
connThread.daemon = True
connThread.start()
但是在线程中,每当我使用编辑数据库的函数时,都会出现此错误:
SQLITE3 ERROR:
SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 9628 and this is thread id 12400
每当我编辑数据库时,我都在程序“ With global_lock:”中使用全局锁。
提前谢谢
答案 0 :(得分:1)
您可以将check_same_thread
参数设置为false。在您的情况下是这样的:
schoolDBConn = sqlite3.connect("SCHOOL_DB.db", check_same_thread=False)
从文档中:
默认情况下,
check_same_thread
是True
,只有创建线程可以使用该连接。如果设置False
,则返回的连接可以在多个线程之间共享。当使用具有相同连接的多个线程时,用户应序列化写入操作,以避免数据损坏。