You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用SQLAlchemy连接MS SQL Server时触发TypeError问题求助

解决SQLAlchemy连接InterSystems ODBC DSN的问题

首先,你遇到的问题核心是用错了SQLAlchemy的数据库方言mssql+pyodbc是专门为Microsoft SQL Server设计的,而你连接的是InterSystems的ODBC数据源,两者的数据库系统逻辑、语法兼容度不同,导致连接或执行SQL时出错。

下面是两种可行的解决方案:

方案一:使用InterSystems专用的SQLAlchemy方言

InterSystems的IRIS(及旧版Cache)有社区维护的SQLAlchemy方言包,能更好地适配其数据库特性:

  1. 安装适配你SQLAlchemy 1.2.5版本的方言包:
    pip install sqlalchemy-intersystems-iris==1.0.0  # 选择支持SQLAlchemy 1.2.x的版本
    
  2. 修改连接字符串,使用专用方言:
    from sqlalchemy import create_engine
    import pyodbc
    
    # 针对IRIS用iris+pyodbc方言,旧版Cache可尝试cache+pyodbc
    engine = create_engine("iris+pyodbc://user:pass@mydsn", echo=True)
    cnxn = engine.connect()
    # 复用你之前pyodbc能正常执行的SQL即可
    rows = cnxn.execute("SELECT name FROM sys.tables").fetchall()
    print(rows)
    

方案二:使用通用ODBC方言(无需额外安装包)

如果不想安装专用方言,可以用SQLAlchemy的通用ODBC连接方式,绕过SQL Server特有的逻辑:

  1. 修改连接字符串为通用ODBC格式:
    from sqlalchemy import create_engine
    import pyodbc
    
    # 用odbc+pyodbc作为通用方言,直接指定DSN
    engine = create_engine("odbc+pyodbc://user:pass@mydsn", echo=True)
    # 若DSN配置有问题,可显式指定驱动:
    # engine = create_engine("odbc+pyodbc://user:pass@?driver=InterSystems+ODBC&dsn=mydsn")
    cnxn = engine.connect()
    rows = cnxn.execute("SELECT name FROM sys.tables").fetchall()
    print(rows)
    

额外注意点

  • 确认SELECT name FROM sys.tables在你的InterSystems数据库中有效:如果pyodbc能正常执行就没问题;如果不行,可能需要替换为InterSystems对应的系统查询,比如查询持久化表可以用SELECT Name FROM %Dictionary.ClassDefinition WHERE Super='%Persistent'
  • 检查版本兼容:你的Python3.6.4建议搭配pyodbc 3.x版本,确保和SQLAlchemy 1.2.5适配。

内容的提问来源于stack exchange,提问作者Maki

火山引擎 最新活动