在SQLAlchemy/Elixir中选择不同的列值

Dav*_*d Z 44 python sql sqlalchemy python-elixir

在我使用SQLAlchemy和Elixir编写的一个小脚本中,我需要获取特定列的所有不同值.在普通的SQL中,它只是一个简单的问题

SELECT DISTINCT `column` FROM `table`;
Run Code Online (Sandbox Code Playgroud)

我知道我可以"手动"运行该查询,但如果可以,我宁愿坚持使用SQLAlchemy声明性语法(和/或Elixir).我确信它一定是可能的,我甚至在SQLAlchemy文档中看到过这种类似的暗示,但我一直在寻找这些文档几个小时(以及Elixir的文档),我就是不能似乎真的弄清楚它将如何完成.那我错过了什么?

Ant*_*sma 89

您可以查询映射类的列属性,并且Query类具有生成distinct()方法:

for value in Session.query(Table.column).distinct():
     pass
Run Code Online (Sandbox Code Playgroud)

  • kchau:你是不是试图在一个类上调用query_property描述符而不是在Session上调用查询方法?那么SomeClass.query(...)而不是Session.query(...)? (3认同)
  • 嗯,我可以发誓我试过了,但它给了我一个错误......但显然没有。它有效,谢谢! (2认同)

Cha*_* L. 9

我想对不同的值进行计数,并首先使用.distinct()and.count()进行计数,得到一个值,然后进行不同的值。我必须执行以下操作

from sqlalchemy.sql import func
Session.query(func.count(func.distinct(Table.column))
Run Code Online (Sandbox Code Playgroud)


Árp*_*nyi 7

对于这个类:

class Assurance(db.Model):
    name = Column(String)
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

assurances = []
for assurance in Assurance.query.distinct(Assurance.name):
    assurances.append(assurance.name)
Run Code Online (Sandbox Code Playgroud)

你将拥有不同值的列表

  • 这只能在具有 DISTINCT ON 扩展名的 Postgresql 中按预期工作。接受的答案更加便携,并且避免选择额外的列。 (2认同)

小智 5

上课,

class User(Base):
    name = Column(Text)
    id = Column(Integer, primary_key=True)
Run Code Online (Sandbox Code Playgroud)

方法一:使用load_only

from sqlalchemy.orm import load_only
records= (db_session.query(User).options(load_only(name)).distinct().all())
values = [record[0] if len(record) == 1 else record for record in records]  # list of distinct values
Run Code Online (Sandbox Code Playgroud)

方法2:不进行任何导入

records = db_session.query(User.name).distinct().all()
l_values = [record.__dict__[l_columns[0]] for record in records]
Run Code Online (Sandbox Code Playgroud)