Как разделить базу данных по различным потокам в Python - PullRequest
0 голосов
/ 02 января 2019

В настоящее время я работаю над проектом, который требует совместного использования базы данных в разных потоках 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?)

1 Ответ

0 голосов
/ 02 января 2019

Когда два потока совместно используют соединение, они также совместно используют транзакцию.Это может нарушить логику вашей программы.

Просто используйте два соединения, по одному на поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...