В настоящее время я работаю над проектом, который требует совместного использования базы данных в разных потоках Python.В настоящее время я использую sqlite3 с python3.7.
Приведенный ниже код является проблемой, схожей с тем, что у меня есть
import threading, os, sqlite3
os.chdir("/home/aditya/Desktop")
connection = sqlite3.connect("Name.db") # I am not using :memory: because I need something permanent
cursor = connection.cursor()
cursor.execute("create table if not exists Name (names varchar)")
cursor.execute("insert into Name values('Some_Name')")
print("result from original database", end = "\t")
result = cursor.execute("select * from Name")
print(result.fetchall())
def return_cursor():
conn = sqlite3.connect("Name.db")
cur = conn.cursor()
return cur
def DB_thread_one():
print("result from thread 1", end = "\t")
cur = return_cursor()
result = cur.execute("select * from Name")
print(result.fetchall()) # THIS RETURNS AN EMPTY LIST
def DB_thread_two():
print("result from thread 1", end = "\t")
cur = return_cursor()
result = cur.execute("select * from Name")
print(result.fetchall()) # THIS RETURNS AN EMPTY LIST
if __name__ == "__main__":
# creating thread
t1 = threading.Thread(target=DB_thread_one)
t2 = threading.Thread(target=DB_thread_two)
# starting thread 1
t1.start()
# starting thread 2
t2.start()
# wait until thread 1 is completely executed
t1.join()
# wait until thread 2 is completely executed
t2.join()
# both threads completely executed
print("Done!")
Я нашел несколько решений для этого и наткнулся на что-то под названием shared-cache
и попытался включить его с помощью cache = shared
, но он не работал, так как sqlite3.connect
не имеет никакого параметра cache
.
Я также читал, что python препятствует совместному использованию подключения к базе данных через разные потоки, но эта ссылка говорит, что SQLite теперь поддерживает совместное использование базы данных через потоки.
Что я пропустил?Есть ли лучшая альтернатива для sqlite3, которая позволяет совместно использовать базы данных по потокам (sqlalchemy?)