【问题标题】:SQLAlchemy - query without writing/locking the databaseSQLAlchemy - 在不写入/锁定数据库的情况下进行查询
【发布时间】:2017-09-08 21:39:18
【问题描述】:

我有一个多线程数据分析管道,它查询数据库(通过 SQLAlchemy)。此外,数据库通过 syncthing 跨多个系统同步 - 长话短说,这意味着不能始终保证写入权限。

即使我能够保证写访问,我仍然偶尔而且相当随机地遇到操作错误:

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找到。

如何更改我的代码,以便可以查询数据库而不必依赖可写/解锁的文件?我检查了文件的校验和,它在查询时没有改变,所以很明显我没有写任何东西。因此,我想应该有某种方法可以在没有写入权限的情况下提取我正在寻找的信息?

【问题讨论】:

    标签: python multithreading sqlite permissions sqlalchemy


    【解决方案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

    【讨论】:

    • 关于否决票,我理解如果您对使用 Peewee 不感兴趣——这篇博文详细介绍了使用 SQLite 进行锁定和事务管理的复杂性,并且适用于任何 ORM您正在使用(或未使用)。
    • 这里的反对者,我很抱歉之前没有发表评论,有些事情需要注意。至于为什么,我不反对 Peewee。原因是这几乎是link only answer。我知道您可能对在此处引用自己的内容不感兴趣,但如果用户不需要按照链接来获取基础知识,它会更好地服务于该站点。答案本身应该回答并保留进一步阅读的链接。此外,链接腐烂是一回事。
    • 感谢您的澄清——我很欣赏建设性的反馈(而且反对意见似乎很公平)。再次感谢!
    猜你喜欢
    • 2016-05-03
    • 2017-02-07
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多