如何修复操作错误:数据库已使用 sqlalchemy 锁定

问题描述 投票:0回答:1

我已经与 sqlite 和 msqlalchemy 建立了数据库连接

DATABASE = 'sqlite:////someaddress.db'
db = create_engine(DATABASE, echo=True, connect_args={'timeout': 15})
engine = db.raw_connection()

然后我有一个轮询数据库的脚本,如下所示:

POSTCODES = pd.read_sql("SELECT pcd, pcd2, pcds, LAT, LONG FROM postcodes", engine)

它多次执行此操作,没有任何问题。

但是当我尝试这样的代码时:

self.df.to_sql(name='vouchers', con=engine, if_exists='replace', index=False)

我收到此错误:

OperationalError: database is locked

有没有办法确保连接关闭或以其他方式解决此错误。

pandas sqlite sqlalchemy
1个回答
0
投票

使用上下文管理器可能是最简单的。 您不想永远保持连接,因此您想要连接,然后让上下文管理器关闭连接。

我认为

SQLAlchemy
会希望你的
SQL
陈述在你传递时包含在
text()
中。

我也同意@GordThompson 尝试使用与内容匹配的变量名称,即。

engine
表示
Engine()
conn
connection
表示
Connection()

#...
from sqlalchemy.sql import text

DATABASE = 'sqlite:////someaddress.db'
engine = create_engine(DATABASE, echo=True, connect_args={'timeout': 15})

# No commit, just reading, after context manager ends the connection is returned to the pool.
with engine.connect() as conn:
    POSTCODES = pd.read_sql(text("SELECT pcd, pcd2, pcds, LAT, LONG FROM postcodes"), conn)

# Commit after writing, after context manager ends the connection is returned to the pool.
with engine.connect() as conn:
    self.df.to_sql(name='vouchers', con=conn, if_exists='replace', index=False)
    conn.commit()

文档中有很多有关连接和事务的有用信息。

连接文档

© www.soinside.com 2019 - 2024. All rights reserved.