在多线程Python中使用sql

时间:2018-10-26 21:54:28

标签: python sqlite python-multithreading

我有一个服务器,允许(管理员)创建,删除或编辑其他用户的详细信息, 我已经在函数内的游标旁边创建了数据库:

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:”中使用全局锁。

提前谢谢

1 个答案:

答案 0 :(得分:1)

您可以将check_same_thread参数设置为false。在您的情况下是这样的:

schoolDBConn = sqlite3.connect("SCHOOL_DB.db", check_same_thread=False)

从文档中:

  

默认情况下,check_same_threadTrue,只有创建线程可以使用该连接。如果设置False,则返回的连接可以在多个线程之间共享。当使用具有相同连接的多个线程时,用户应序列化写入操作,以避免数据损坏。