Python3.11中SQLAlchemy初始化表报错,原Python3.8可正常运行
问题分析与解决方法
错误原因
升级后的SQLAlchemy为2.0+版本,该版本完全移除了autoload、autoload_with的旧用法,原代码中通过sql.Table传入这两个参数的写法已不再被支持,因此触发参数格式错误。
另外原代码存在一个潜在问题:connection_string是元组类型,而odbc_connect需要传入字符串,直接传入元组会导致后续连接失败。
解决方法
1. 适配SQLAlchemy 2.0+的表加载方式
有两种可行写法:
写法一:通过metadata.reflect()加载表
metadata = sql.MetaData() # 反射加载指定表(省略only参数可加载所有表) metadata.reflect(bind=engine, only=['Input_tickers']) # 获取目标表对象 initTable = metadata.tables['Input_tickers']
写法二:直接使用autoload_with参数
metadata = sql.MetaData() # 仅传入autoload_with参数即可完成表反射 initTable = sql.Table('Input_tickers', metadata, autoload_with=engine)
2. 修正连接字符串格式
将原元组形式的连接字符串改为字符串拼接:
connection_string = ( r"DRIVER={SQL Server};" r"SERVER=Server_Name;" r"Database=DB_Name;" r"UID=Domain\Username;" r"Trusted_Connection=yes;" )
完整修正后的代码示例
import yfinance as yf import pandas as pd import sqlalchemy as sql from sqlalchemy import select from sqlalchemy.engine import URL from datetime import datetime as t import pyodbc # 修正连接字符串为字符串类型 connection_string = ( r"DRIVER={SQL Server};" r"SERVER=Server_Name;" r"Database=DB_Name;" r"UID=Domain\Username;" r"Trusted_Connection=yes;" ) connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string}) engine = sql.create_engine(connection_url, use_setinputsizes=False) connection = engine.connect() metadata = sql.MetaData() # 使用SQLAlchemy 2.0+支持的方式加载表 initTable = sql.Table('Input_tickers', metadata, autoload_with=engine)
内容的提问来源于stack exchange,提问作者Goodwin Lion
相关产品推荐
相关产品推荐

