SQLAlchemy获取所有列组合的行

问题描述 投票:1回答:2

我正在使用Flask-SQLAlchemy(但愿意在需要时使用SQLAlchemy),并试图找出一种方法来从包含4列组合的表中获取所有值。

例如,我有这个对象Class-

class SearchRule(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  type = db.Column(db.Text)
  location = db.Column(db.Text)
  owner = db.Column(db.Text)
  delegate = db.Column(db.Text)
  set_id = db.Column(db.Integer, db.ForeignKey('set.id'))

我想返回的是set_id的所有值,其中type + location + owner + delegate的组合是唯一的。

这里是示例表-

id    type    location    owner    delegate    set_id
1     db      usa         matt     joe         5
2     db      usa         matt     joe         6
3     db      uk          jim      bob         9
4     db      uk          jim      bob         12

从此表中,我想返回如下内容-

[
  ('db', 'usa', 'matt', 'joe', [5, 6]), 
  ('db', 'uk, 'jim', 'bob', [9, 12])
]

Any help would be greatly appreciated!
python sqlalchemy flask-sqlalchemy
2个回答
1
投票

为什么不在这里工作呢?分组依据将根据分组内容为您提供不同的列值,然后对聚合列应用distinct将为您提供不同的id值。如果您想要ID的所有值,只需省略distinct()


from sqlalchemy.sql import func

query = session.query.(SearchRule.type, SearchRule.location,
                           SearchRule.owner, SearchRule.delegate, 
                           func.group_concat(SearchRule.set_id.distinct())/
               .group_by(SearchRule.type, SearchRule.location,
                         SearchRule.owner, SearchRule.delegate)

group_concat将产生一个逗号连接的字符串,您应该可以将其转换为python代码中所需的任何内容


0
投票

您需要运行的查询是:

session.query(SearchRule.type, SearchRule.location, 
              SearchRule.owner, SearchRule.delegate).distinct() 

此查询包含您的数据的结果是:

('db', 'usa', 'matt', 'joe')
('db', 'uk', 'jim', 'bob')

要获取set-id列表,需要使用group-concat:

session.query(SearchRule.type, SearchRule.location, 
            SearchRule.owner, SearchRule.delegate, func.group_concat(SearchRule.set_id)).group_by(SearchRule.type, 
            SearchRule.location, SearchRule.owner, SearchRule.delegate)

结果是:

('db', 'uk', 'jim', 'bob', '9,12')
('db', 'usa', 'matt', 'joe', '5,6')
© www.soinside.com 2019 - 2024. All rights reserved.