0

(管理者)が他のユーザーの詳細を作成、削除、または編集できるサーバーがあります。関数内のカーソルと一緒にデータベースを作成しました:

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:」でグローバル ロックを使用しています。

前もって感謝します

4

1 に答える 1

2

check_same_threadパラメータを false に設定できます。あなたの場合、このように:

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

ドキュメントから:

デフォルトでcheck_same_threadTrue、作成スレッドのみが接続を使用できます。set の場合False、返された接続は複数のスレッドで共有される場合があります。同じ接続で複数のスレッドを使用する場合、データの破損を避けるために、書き込み操作はユーザーがシリアル化する必要があります。

于 2018-10-26T21:58:58.833 に答える