我正在使用 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,...)
Run Code Online (Sandbox Code Playgroud)
这部分很好用,很容易阅读等等。问题是我必须运行一个最终存储过程来将加载器表中的数据插入到实时表中。通常,sqlalchemy 知道在 INSERT/UPDATE/DELETE 之后提交,但是当我运行这个最终存储过程时不想为我做提交。
在尝试了多种方法后,我看到 db 中的事务未提交。我知道 sqlalchemy 非常灵活,我使用了大约 3% 的功能,最简单的方法是什么?我想我需要使用 sqlalchemy 核心而不是 ORM。我看到了使用 sessionmaker 的例子,但我认为它垄断了引擎对象并且不允许熊猫访问它。
connection = engine.connect()
transaction = connection.begin()
connection.execute("EXEC sp_doLoaderStuff")
transaction.commit()
connection.close()
Run Code Online (Sandbox Code Playgroud)
我曾尝试.execute从连接级别调用,从游标级别调用,甚至使用该.raw_connection()方法都没有成功。
connection = engine.raw_connection()
connection.autocommit = True
cursor = connection.cursor()
cursor.execute("EXEC sp_doLoaderStuff")
connection.commit()
connection.close()
Run Code Online (Sandbox Code Playgroud)
任何想法我在这里缺少什么?
尝试在SQL 2012中使用FOR XML.需要有这样的结果:
<Loader xmlns:xsi="url1" xmlns="url2">
<Buy_New>
<Ticker>IBM</Ticker>
<Acct>12345</Acct>
<Qty>10</Qty>
</Buy_New>
<Sell_New>
<Ticker>MSFT</Ticker>
<Acct>12345</Acct>
<Qty>15</Qty>
</Sell_New>
<Buy_New>
<Ticker>IBM</Ticker>
<Acct>12345</Acct>
<Qty>10</Qty>
</Buy_New>
</Loader>
Run Code Online (Sandbox Code Playgroud)
在这里查看,MSDN等,我没有看到在我的查询中动态更改<Buy_New>和<Sell_New>(我有大约20种不同类型可用)的方法,我已经探索过使用FOR XML PATH和FOR XML EXPLICIT但两者似乎要求静态元素标签.
有没有办法从查询中的行驱动标签?
@Jon C当然:这就是我所拥有的:
SELECT
(
SELECT
Investment1 as Investment,
EventDate1 as Date,
Quantity1 as Quantity
FROM #temptable e1 where e1.temp_id = e.temp_id
FOR XML PATH(''),TYPE
) AS 'DYNAMICTAG'
FROM #temptable e
FOR XML PATH(''), ROOT('Loader')`
Run Code Online (Sandbox Code Playgroud)
以下是结果示例.DYNAMICTAG是需要改变的部分<Buy_New>,<Sell_New>等等.
<Loader>
<DYNAMICTAG>
<Investment>XYZ</Investment>
<Date>2015-05-08T00:00:00</Date>
<Quantity>50</Quantity>
</DYNAMICTAG>
<DYNAMICTAG>
<Investment>ABC</Investment>
<Date>2015-05-08T00:00:00</Date> …Run Code Online (Sandbox Code Playgroud)