我已经与 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
有没有办法确保连接关闭或以其他方式解决此错误。
使用上下文管理器可能是最简单的。 您不想永远保持连接,因此您想要连接,然后让上下文管理器关闭连接。
我认为
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()
文档中有很多有关连接和事务的有用信息。