为何SQLAlchemy中直接调用select会报参数数量错误?
为什么SQLAlchemy导入select后还得用alchemy.select(),直接调用会触发参数错误?
核心问题:你搞混了两个完全不同的select
你遇到的报错本质是把SQLAlchemy里的两种select用法搞混了:
1. Table对象的select()实例方法
cookies是Table类型的对象,它自带的select()是实例方法,这个方法的规则是:只接受self这1个位置参数,所有其他配置(比如指定要查询的列、筛选条件)都得用关键字参数传递。
你注释掉的错误代码:
s = cookies.select(cookies.c.cookie_name, cookies.c.quantity)
这里你直接把两个列作为位置参数传进去,相当于给方法传了3个参数(self+两个列),完全不符合方法的参数要求,所以触发了那个TypeError。
如果非要用Table.select()来指定列,得这么写:
s = cookies.select(columns=[cookies.c.cookie_name, cookies.c.quantity])
2. 顶层全局的select()构造函数
你通过from sqlalchemy import select导入的是全局构造函数,这才是构建SELECT语句的标准方式,它支持直接把多个列作为位置参数传进去,用法如下:
from sqlalchemy import select s = select(cookies.c.cookie_name, cookies.c.quantity)
你代码里用alchemy.select(...)能正常运行,是因为alchemy是sqlalchemy的别名,调用的就是这个顶层构造函数——你觉得直接用select报错,大概率是代码里写错了(比如误写成cookies.select()而不是select()),不是导入的select本身有问题。
一句话总结
- 别把
Table实例的select()方法和顶层select()构造函数搞混 - 直接用导入的
select(列1, 列2)完全可行,没必要非得用alchemy.select() - 用
Table.select()的话,必须通过关键字参数来传配置
内容的提问来源于stack exchange,提问作者Jim Keith
相关产品推荐
相关产品推荐

