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

Python3.11中SQLAlchemy插入单行MSSQL数据报错求助

解决Python3.11 + SQLAlchemy插入MSSQL单行数据的ArgumentError问题

问题原因

SQLAlchemy适配Python3.11的新版本中,对execute()方法接收的数据参数校验更严格:必须传入包含元组或字典的可迭代对象(比如列表),而适配Python3.6的旧版本允许直接传入单个字典/元组,这就是升级后触发List argument must consist only of tuples or dictionaries错误的核心原因。

解决方案

根据你使用SQLAlchemy的Core或ORM模式,对应修改代码:

1. 若使用SQLAlchemy Core

将单行数据包装成列表再传入execute()方法:

from sqlalchemy import create_engine, Table, Column, String, DateTime, MetaData
import datetime

# 初始化数据库连接与表结构
engine = create_engine("mssql+pyodbc://your_user:your_pass@your_dsn")
metadata = MetaData()
target_table = Table(
    "your_table_name",
    metadata,
    Column("col_str1", String),
    Column("col_datetime", DateTime),
    Column("col_str2", String),
    Column("col_str3", String)
)

# 待插入的单行数据
single_record = {
    "col_str1": "sample_text_1",
    "col_datetime": datetime.datetime.now(),
    "col_str2": "sample_text_2",
    "col_str3": "sample_text_3"
}

# 修复后的插入代码
with engine.connect() as conn:
    # 关键:把单个字典放到列表里
    conn.execute(target_table.insert(), [single_record])
    conn.commit()

2. 若使用SQLAlchemy ORM

直接用session.add()插入单个对象;如果误用add_all(),则需要把单个对象包装成列表:

from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import datetime

Base = declarative_base()

# 定义ORM模型
class YourTable(Base):
    __tablename__ = "your_table_name"
    col_str1 = Column(String, primary_key=True)
    col_datetime = Column(DateTime)
    col_str2 = Column(String)
    col_str3 = Column(String)

# 初始化会话
engine = create_engine("mssql+pyodbc://your_user:your_pass@your_dsn")
Session = sessionmaker(bind=engine)
session = Session()

# 创建单行记录对象
new_record = YourTable(
    col_str1="sample_text_1",
    col_datetime=datetime.datetime.now(),
    col_str2="sample_text_2",
    col_str3="sample_text_3"
)

# 方式一:用add直接插入单个对象(推荐)
session.add(new_record)

# 方式二:如果用add_all,需要包装成列表
# session.add_all([new_record])

session.commit()
session.close()

额外说明

如果你的代码中是直接传入单个元组而非字典,修复逻辑完全一致:把(val1, val2, val3, val4)改成[(val1, val2, val3, val4)]即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:05:12