使用SQLAlchemy创建SELECT查询时出现ArgumentError错误
SQLAlchemy ArgumentError 错误原因分析
问题描述
尝试使用SQLAlchemy从数据库获取数据时,遇到如下错误:
sqlalchemy.exc.ArgumentError: Column expression, FROM clause, or other columns clause element expected, got [Table('params', MetaData(), Column('paramID', Integer(), table=, primary_key=True, nullable=False), Column('item', String(), table=), Column('value', Float(), table=), schema=None)]. Did you mean to say select(Table('params', MetaData(), Column('paramID', Integer(), table=, primary_key=True, nullable=False), Column('item', String(), table=), Column('value', Float(), table=), schema=None))?
相关代码:
metadata = MetaData() params = Table('params', metadata, Column('paramID', Integer(), primary_key=True), Column('item', String), Column('value', Float), Column('buttongroup', String), Column('fg_color', String), Column('bg_color', String)) engine = create_engine('...') con = engine.connect() selpar = select([params]).order_by(params.c.paramID) rppar = con.execute(selpar).fetchall()
错误原因
这个错误是因为你使用的SQLAlchemy版本为2.x,但代码沿用了1.x的语法规则。
在SQLAlchemy 1.x中,select()函数允许传入包含表/列的列表作为参数,比如select([params])是合法写法;但到了2.x版本,select()的参数规则发生了变化,不再需要用列表包裹表对象,直接传入表本身即可。
你代码里的select([params])在2.x版本中会被识别为传入了一个列表(元素是表对象),而非符合要求的表表达式,因此触发了ArgumentError。
解决方法
将select([params])修改为以下两种写法之一即可:
# 方式1:直接传入表对象 selpar = select(params).order_by(params.c.paramID) # 方式2:明确选择表的所有列 selpar = select(params.c).order_by(params.c.paramID)
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

