Python select()和table.select()之间的差异

Python select()和table.select()之间的差异,python,sqlalchemy,Python,Sqlalchemy,select和tablename.select()之间有什么区别?当我将列名传递给表时。选择类似的: table.select(table.c.name) sql就像 select * from tablename where tablename.name 当我将一列传递给时,选择(实例方法): sql就像 select name from tablename 我希望得到与选择和表格相同的结果。选择 当我阅读select的文档时,它是相同的,所以它是相同的方法,但为什么它们有不同的行为?大

select
tablename.select()之间有什么区别?当我将列名传递给
表时。选择类似的

table.select(table.c.name)
sql就像

select * from tablename where tablename.name
当我将一列传递给
时,选择
(实例方法):

sql就像

select name from tablename
我希望得到与
选择
表格相同的结果。选择


当我阅读
select
的文档时,它是相同的,所以它是相同的方法,但为什么它们有不同的行为?

大概,你的意思是
select()

select()
函数明确地将一组列作为其参数,其结果是独立的。您还可以传入
FromClause
对象(如表或别名),它将从该对象获取列。这将在核心教程的第页中详细描述

另一方面,采用的是
whereclause
第一个参数,而不是一组列。换句话说,无论传递给该方法的是什么,都要为select设置
WHERE
过滤器,而不是要选择的列。通过为where子句传入一列,您将选择所有列,但在
where[columnname]
上进行筛选。没有太多的过滤器,因为在那里表达式并没有真正限制哪些行将匹配

正确使用
table.select()
函数是为了传入一个选择过滤器,并选择所有列:

table.select(table.c.name != None)
将其汇编为:

SELECT * FROM tablename WHERE tablename.name IS NOT NULL;
(尽管SQLAlchemy知道存在哪些列,但会将
*
扩展为所有
列名的显式列表)


您应该坚持使用
select()
函数只选择特定的列。

根据文档,table.select接收where子句(默认值=无)和字符串数组。由于您只传递了一个字符串,因此它可能已将其作为WHERE子句接收。尝试这样做:table.select([table.c.name])根据核心教程的选择章节,
select([table])
将扩展到它的每一列,并从
子句生成
。@dralshehri:我稍后会尝试检查这个问题,但这可能是我写这个答案(现在已经有7年多了)后引入的一个新功能。我们现在有5个版本@dralshehri注意到问题的关键是选择列的子集,而不是表中的所有列。谢谢你的回答,即使在几年之后,你的回答还是很有帮助的
SELECT * FROM tablename WHERE tablename.name IS NOT NULL;