我使用sqlite
和sqlalchemy
将pandas
DataFrame
写入数据库。我很难理解事务和回滚是如何与这种组合一起工作的。我遵循了sqlalchemy网站上关于workarounds for sqlite的说明,但这似乎没有帮助。考虑下面的代码。在
我首先创建一个空数据库。在
from sqlalchemy import create_engine, event
import pandas as pd
url = r'sqlite:///'
engine = create_engine(url)
@event.listens_for(engine, "connect")
def do_connect(dbapi_connection, connection_record):
# disable pysqlite's emitting of the BEGIN statement entirely.
# also stops it from emitting COMMIT before any DDL.
dbapi_connection.isolation_level = None
@event.listens_for(engine, "begin")
def do_begin(conn):
# emit our own BEGIN
conn.execute("BEGIN")
pd.read_sql("SELECT name FROM sqlite_master", engine)
正如预期的那样,产出是。在
^{pr2}$现在我在事务中使用to_sql
方法编写一个DataFrame
,并有目的地引发一个异常,并捕捉它。我希望下面的代码可以回滚to_sql
所做的任何操作。在
data = pd.DataFrame()
# Start a transaction so we can roll back in case of issues
connection = engine.connect()
trans = connection.begin_nested()
try:
# Save data and script
data.to_sql('data', connection.connection, if_exists='replace')
raise Exception
# Commit transaction
trans.commit()
except Exception as err:
trans.rollback()
connection.close()
pd.read_sql("SELECT name FROM sqlite_master", engine)
但是,从输出中我们可以看到数据库没有回滚到我们启动事务时。我希望看到这个步骤的输出与上面的相同。在
Out[1]:
name
0 data
1 ix_data_index
我遗漏了什么,有没有办法解决这个问题?在
版本:
sys.version
Out[13]: '3.4.1 |Anaconda 2.3.0 (64-bit)| (default, Sep 24 2014, 18:32:42) [MSC v.1600 64 bit (AMD64)]'
pd.__version__
Out[14]: '0.16.2'
sqlalchemy.__version__
Out[15]: '1.0.8'
目前没有回答
相关问题 更多 >
编程相关推荐