SQLAlchemy 错误:尝试完成事务失败。没有找到对应的交易

Efs*_*dis 8 python sqlalchemy pyodbc msodbcsql17 azure-synapse

我已经安装了:

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

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

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()
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

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

data_frame = pandas.read_sql("SELECT COUNT(*) FROM customers", engine)
Run Code Online (Sandbox Code Playgroud)

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

customers_count = session.query(Customer).count()
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激。

Gor*_*son 9

SQLAlchemy 文档mssql+pyodbc://\xe2\x80\xa6刚刚更新,包含以下内容(对于 SQLA 1.4/2.0):

\n
\n

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

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