Использование sql в нескольких потоках Python - PullRequest
0 голосов
/ 27 октября 2018

У меня есть сервер, который позволяет (администраторам) создавать, удалять или редактировать данные других пользователей, Я создал базу данных вместе с ее курсорами внутри функции:

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

Я использую глобальные блокировки в моей программе «С global_lock:» всякий раз, когда я редактирую базу данных.

Заранее спасибо

1 Ответ

0 голосов
/ 27 октября 2018

Вы можете установить для параметра check_same_thread значение false. Вот как в вашем случае:

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

Из документов:

По умолчанию check_same_thread равно True, и только созданный поток может использовать соединение. Если установлено False, возвращаемое соединение может быть общим для нескольких потоков. При использовании нескольких потоков с одним и тем же соединением операции записи должны быть сериализованы пользователем, чтобы избежать повреждения данных.

...