2017-04-12 36 views
-1

我有一個多線程數據分析管道,它查詢數據庫(通過SQLAlchemy)。此外,數據庫通過同步在多個系統間同步 - 長話短說,這意味着寫入權限並非始終得到保證。SQLAlchemy - 無需編寫/鎖定數據庫的查詢

即使我能保證的寫訪問,我還是偶爾會和,而隨機獲得操作上的失誤:

OperationalError: (sqlite3.OperationalError) database is locked 

我用來加載用於查詢的會話的代碼如下:

def loadSession(db_path): 
    db_path = "sqlite:///" + path.expanduser(db_path) 
    engine = create_engine(db_path, echo=False) 
    Session = sessionmaker(bind=engine) 
    session = Session() 
    Base.metadata.create_all(engine) 
    return session, engine 

並且可以在其完整背景下看到here

我的查詢(我把它變成一個價值的方式)是這樣的:

session, engine = loadSession(db_path) 
    sql_query=session.query(LaserStimulationProtocol).filter(LaserStimulationProtocol.code==stim_protocol_dictionary[scan_type]) 
    mystring = sql_query.statement 
    mydf = pd.read_sql_query(mystring,engine) 
    delay = int(mydf["stimulation_onset"][0]) 

再次,完整的上下文可以發現here

我該如何更改我的代碼,以便可以查詢數據庫而不必依賴於可寫入/解鎖的文件?我已經檢查過該文件的校驗和,並且它在查詢時不會改變,所以顯然我沒有寫任何東西。因此,我想應該有一些方法來提取我沒有寫入權限的信息?

回答

-1

我已經寫上提供的問題,某些方面的一些解釋這一主題的博客文章,以解決它:http://charlesleifer.com/blog/multi-threaded-sqlite-without-the-operationalerrors/

Peewee ORM具有被設計爲支持多個線程寫入到一個擴展SQLite數據庫。 http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#sqliteq

+0

關於downvote,我知道如果您對使用Peewee不感興趣 - 博客文章詳細介紹了SQLite的鎖定和事務管理的複雜性,不管您使用何種ORM (或不使用)。 – coleifer

+2

在這裏downvoter,我很抱歉沒有留下評論之前,有些事情需要注意。至於爲什麼,我沒有反對Peewee。原因是,這幾乎是[只鏈接回答](https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)。我明白,如果用戶不需要按照鏈接獲取基本信息,則可能對此處引用自己不感興趣,但會更好地服務於此網站。答案本身應該回答並保留進一步閱讀的鏈接。此外,鏈接腐爛是一件事情。 –

+0

謝謝澄清 - 我很欣賞建設性的反饋意見(downvote看起來公平)。再次感謝! – coleifer