我使用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,...)
这部分工作得很好,非常容易阅读,等等。问题是我必须运行最终的存储过程才能将加载程序表中的数据插入到实时表中。通常,sqlalchemy知道在INSERT / UPDATE / DELETE之后提交,但是当我运行这个最终存储过程时,我不想为我做提交。
在尝试了多种方法后,我看到db中的事务未提交。我知道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()
我在这里缺少什么想法?
答案 0 :(得分:3)
完全自我造成。使用正常工作的raw_connection()方法的正确工作代码是:
connection = engine.raw_connection()
cursor = connection.cursor()
cursor.execute("EXEC sp_doLoaderStuff")
connection.commit()
connection.close()