71

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

SELECT DISTINCT `column` FROM `table`;

而且我知道我可以“手动”运行该查询,但如果可以的话,我宁愿坚持使用 SQLAlchemy 声明性语法(和/或 Elixir)。我敢肯定这一定是可能的,我什至在 SQLAlchemy 文档中看到了对这种事情的暗示,但是我已经在该文档中寻找了几个小时(以及 Elixir 的文档),我就是不能似乎实际上弄清楚了如何完成。那么我错过了什么?

4

5 回答 5

128

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

for value in Session.query(Table.column).distinct():
     pass
于 2010-02-01T08:17:32.453 回答
9

对于这个类:

class Assurance(db.Model):
    name = Column(String)

你可以这样做:

assurances = []
for assurance in Assurance.query.distinct(Assurance.name):
    assurances.append(assurance.name)

您将获得不同值的列表

于 2016-03-01T08:56:48.130 回答
5

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

from sqlalchemy.sql import func
Session.query(func.count(func.distinct(Table.column))
于 2020-07-17T17:44:36.177 回答
3
for user in session.query(users_table).distinct():
    print user.posting_id
于 2012-02-15T05:10:05.573 回答
2

上课,

class User(Base):
    name = Column(Text)
    id = Column(Integer, primary_key=True)

方法一:使用 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

方法2:没有任何进口

records = db_session.query(User.name).distinct().all()
l_values = [record.__dict__[l_columns[0]] for record in records]
于 2020-11-30T15:58:21.510 回答