You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:50:10