【问题标题】:SQLAlchemy error: An attempt to complete a transaction has failed. No corresponding transaction foundSQLAlchemy 错误:尝试完成事务失败。没有找到对应的交易
【发布时间】:2019-11-29 02:38:30
【问题描述】:

我已经安装了:

  • Ubuntu (18.04)
  • Python (3.6.8)
  • msodbcsql17(用于 SQL Server 的 Microsoft ODBC 驱动程序 17)
  • SQLAlchemy (1.3.5)
  • 熊猫 (0.24.2)

我只想使用带有 Azure SQL 数据仓库的 SQLAlchemy 创建一个概念证明。但是,当我尝试在使用代码映射到客户视图表的客户模型上运行查询时:

import urllib

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

db_username = 'username'
db_password = 'password'
db_database = 'dbname'
db_hostname = 'dbhost'
db_driver = 'ODBC Driver 17 for SQL Server'
db_port = '1433'

db_connectionString = f"DRIVER={{{db_driver}}}; SERVER={{{db_hostname}}}; DATABASE={{{db_database}}}; UID={{{db_username}}}; PWD={{{db_password}}}; PORT={{{db_port}}};"

engine_params = urllib.parse.quote_plus(db_connectionString)

engine = create_engine(f"mssql+pyodbc:///?odbc_connect={engine_params}", echo=True)

Base = declarative_base()

class Customer(Base):
    __tablename__ = 'customers'

    id = Column('Customer_ID', Integer, primary_key=True)

Session = sessionmaker(bind=engine)
session = Session()

customers_count = session.query(Customer).count()

session.close()

抛出以下异常:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]111214;An attempt to complete a transaction has failed. No corresponding transaction found. (111214) (SQLEndTran)

请记住,我可以将 SQLAlchemy 的引擎与 pandas 一起使用并运行本机 SQL 查询,例如:

data_frame = pandas.read_sql("SELECT COUNT(*) FROM customers", engine)

但是,我需要使用 SQLAlchemy 的高级查询 API:

customers_count = session.query(Customer).count()

任何帮助将不胜感激。

【问题讨论】:

  • 嗨!我已经修好了。它适用于第 17 版。
  • 尝试在启用自动提交的情况下创建会话:Session = sessionmaker(bind=engine, autocommit=True)
  • 您好,A) 这个设置是什么意思?在我的应用程序中,我只想获取/读取数据(没有更新、删除、插入操作)。更具体地说,我只想从数据库数据中查询并获取一些聚合。那么为什么要进行事务提交呢?我想在不打开事务的情况下读取数据并自动提交。重要的是不要意外地提交改变数据库状态的东西。我会在星期一试一试,然后告诉你。 B)你相信这会解决它吗? C) create_engine 也有一个自动提交设置。有什么区别?好好的。
  • 查看here 以获得对 SQLAlchemy 自动提交方法的一般描述。在您的情况下,默认 Session 设置 (autocommit=False) 导致 SQLAlchemy 在运行 SELECT count(*) ... 语句之前立即发送 BEGIN (implicit) 以计算表中的行数。指定 autocommit=True 会抑制 BEGIN (implicit) 语句,Azure SQL DW 显然会忽略该语句。
  • @EfstathiosChatzikyriakidise 如果错误现在已经解决,您可以发布作为答案。

标签: python sqlalchemy pyodbc azure-sql-data-warehouse msodbcsql17


【解决方案1】:

mssql+pyodbc://… 的 SQLAlchemy 文档刚刚更新为包括以下内容(适用于 SQLA 1.4/2.0):

Azure SQL 数据仓库不支持事务, 这可能会导致 SQLAlchemy 的“自动开始”(和隐式 提交/回滚)行为。我们可以通过启用自动提交来避免这些问题 在 pyodbc 和引擎级别:

connection_url = sa.engine.URL.create(
    "mssql+pyodbc",
    username="scott",
    password="tiger",
    host="dw.azure.example.com",
    database="mydb",
    query={
        "driver": "ODBC Driver 17 for SQL Server",
        "autocommit": "True",
    },
)
engine = create_engine(connection_url).execution_options(
    isolation_level="AUTOCOMMIT"
)

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 2023-03-11
    • 2014-04-09
    • 2018-06-15
    • 2013-08-10
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多