【问题标题】:stored proc not committing with sqlalchemy/pyodbc存储过程未使用 sqlalchemy/pyodbc 提交
【发布时间】:2015-11-14 06:06:06
【问题描述】:

我正在使用 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 之后提交,但在我运行这个最终存储过程时不想为我进行提交。

在尝试了多种方法后,我看到数据库中的事务处于未提交状态。我知道 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()

任何想法我在这里缺少什么?

【问题讨论】:

    标签: python sql-server sqlalchemy pyodbc


    【解决方案1】:

    完全是自找的。使用运行良好的 raw_connection() 方法的正确工作代码是:

    connection = engine.raw_connection()
    cursor = connection.cursor()
    cursor.execute("EXEC sp_doLoaderStuff")
    connection.commit()
    connection.close()
    

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多