我正在使用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!
为什么不在这里工作呢?分组依据将根据分组内容为您提供不同的列值,然后对聚合列应用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代码中所需的任何内容
您需要运行的查询是:
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')