在python3中使用sqlite、pandas和sqlalchemy很难让rollback工作

2024-09-24 16:32:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用sqlitesqlalchemypandasDataFrame写入数据库。我很难理解事务和回滚是如何与这种组合一起工作的。我遵循了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'

Tags: nameevent数据库forsqlitesqldatasqlalchemy