У меня есть сервер, который позволяет (администраторам) создавать, удалять или редактировать данные других пользователей, Я создал базу данных вместе с курсорами внутри функции:
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:» всякий раз, когда я редактирую базу данных.
заранее спасибо
Вы можете установить для параметра check_same_thread
значение false. Как в вашем случае:
schoolDBConn = sqlite3.connect("SCHOOL_DB.db", check_same_thread=False)
Из документов:
By default,
check_same_thread
isTrue
and only the creating thread may use the connection. If setFalse
, the returned connection may be shared across multiple threads. When using multiple threads with the same connection writing operations should be serialized by the user to avoid data corruption.
Спасибо, похоже, пока работает, проверим, как он работает, когда у меня несколько потоков, надеюсь, блокировка выполнит свою работу правильно
Связанный вопрос: stackoverflow.com/questions/10325683/…