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
相关产品推荐
相关产品推荐

