存储过程未提交 sqlalchemy/pyodbc
stored proc not committing with sqlalchemy/pyodbc
我正在使用 sqlalchemy/pyodbc 连接到 MS SQL 2012 服务器。我选择 sqlalchemy 是因为使用 .read_sql
和 .to_sql
.
与 pandas 数据帧直接集成
在高层次上,我的代码是:
df = dataframe.read_sql("EXEC sp_getsomedata")
<do some stuff here>
finaldf.to_sql("loader_table", engine,...)
这部分效果很好,很容易阅读等等。问题是我必须 运行 一个最终的存储过程来将数据从加载器 table 插入到实时 table。通常,sqlalchemy 知道在 INSERT/UPDATE/DELETE 之后提交,但不想在我 运行 这个最终存储过程时为我提交。
在尝试了多种方法后,我发现数据库中的事务未提交。我知道 sqlalchemy 非常灵活,我使用了大约 3% 的功能,最简单的方法是什么?我想我需要使用 sqlalchemy 核心而不是 ORM。我看到了使用 sessionmaker 的示例,但我认为它独占了引擎对象并且不允许 pandas 访问它。
connection = engine.connect()
transaction = connection.begin()
connection.execute("EXEC sp_doLoaderStuff")
transaction.commit()
connection.close()
我试过从连接级别、游标级别调用 .execute
,甚至使用 .raw_connection()
方法都没有成功。
connection = engine.raw_connection()
connection.autocommit = True
cursor = connection.cursor()
cursor.execute("EXEC sp_doLoaderStuff")
connection.commit()
connection.close()
知道我在这里遗漏了什么吗?
完全是自找的。使用正常工作的 raw_connection() 方法的正确工作代码是:
connection = engine.raw_connection()
cursor = connection.cursor()
cursor.execute("EXEC sp_doLoaderStuff")
connection.commit()
connection.close()
我正在使用 sqlalchemy/pyodbc 连接到 MS SQL 2012 服务器。我选择 sqlalchemy 是因为使用 .read_sql
和 .to_sql
.
在高层次上,我的代码是:
df = dataframe.read_sql("EXEC sp_getsomedata")
<do some stuff here>
finaldf.to_sql("loader_table", engine,...)
这部分效果很好,很容易阅读等等。问题是我必须 运行 一个最终的存储过程来将数据从加载器 table 插入到实时 table。通常,sqlalchemy 知道在 INSERT/UPDATE/DELETE 之后提交,但不想在我 运行 这个最终存储过程时为我提交。
在尝试了多种方法后,我发现数据库中的事务未提交。我知道 sqlalchemy 非常灵活,我使用了大约 3% 的功能,最简单的方法是什么?我想我需要使用 sqlalchemy 核心而不是 ORM。我看到了使用 sessionmaker 的示例,但我认为它独占了引擎对象并且不允许 pandas 访问它。
connection = engine.connect()
transaction = connection.begin()
connection.execute("EXEC sp_doLoaderStuff")
transaction.commit()
connection.close()
我试过从连接级别、游标级别调用 .execute
,甚至使用 .raw_connection()
方法都没有成功。
connection = engine.raw_connection()
connection.autocommit = True
cursor = connection.cursor()
cursor.execute("EXEC sp_doLoaderStuff")
connection.commit()
connection.close()
知道我在这里遗漏了什么吗?
完全是自找的。使用正常工作的 raw_connection() 方法的正确工作代码是:
connection = engine.raw_connection()
cursor = connection.cursor()
cursor.execute("EXEC sp_doLoaderStuff")
connection.commit()
connection.close()