我有一个多线程数据分析管道,用于查询数据库(通过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。
如何更改我的代码以便可以查询数据库而无需依赖文件可写/解锁?我检查了文件的校验和,并且在查询时不会改变,所以很明显我没有写任何东西。因此,我想应该有一些方法来提取我正在寻找的信息而无需写访问权?
答案 0 :(得分:-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