如何解决在 sqlalchemy/marshmallow 中,我们如何通过由左联表提供的 `.group_by()` 来实现 `.count()`? 模型架构应用
我已经尝试了我能想到的几乎所有变体,但仍然找不到flask_sqlalchemy
、marshmallow_sqlalchemy
的这种“组合”的答案。当我到达端点时,我设法获得了大量“无错误”响应,但没有一个给出我需要的响应(其中 severity
来自“左关节”表,而 {{1 }} 是每个 Report 的 count
每个值的数量的计数:
severity
这是我的设置/配置:
模型
[
{'study': '11111','project': 'AAAAA','details': [
{'severity': 'warning','count': 65},{'severity': 'error','count': 55}
]},{'study': '22222','count': 21},'count': 5}
]},{'study': '55555','project': 'BBBBB','count': 102},'count': 11}
]}
]
架构
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class Report(db.Model):
__tablename__ = 'report'
id = db.Column(db.Integer,primary_key=True)
project = db.Column(db.String)
study = db.Column(db.String)
details= db.relationship("Detail",back_populates="report")
class Detail(db.Model):
__tablename__ = 'detail'
id = db.Column(db.Integer,primary_key=True)
domain = db.Column(db.String(2))
record = db.Column(db.SMALLINT)
count = db.Column(db.Integer)
severity = db.Column(db.String)
report_id = db.Column(db.Integer,db.ForeignKey('report.id'))
report = db.relationship("Report",back_populates="details")
应用
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema,SQLAlchemySchema
from marshmallow_sqlalchemy.fields import fields
class ReportSchema(SQLAlchemyAutoSchema):
class Meta:
model = Report
details = ma.Nested(DetailSchema,many=True)
class DetailSchema(SQLAlchemyAutoSchema):
class Meta:
model = Detail
上面给我的输出
它似乎显示了我期望的带有计数和合并的原始 SQL...
import connexion
basedir = os.path.abspath(os.path.dirname(__file__))
app = connex_app.app
app.config["SQLALCHEMY_DATABASE_URI"] = db_path
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
reports_schema = ReportSchema(many=True)
@connex_app.route('/api/reports_summary')
def reports_starburst():
reports = db.session.query(Report.project,Report.study,Detail.severity,func.count(Detail.severity).label('SeverityCount')) \
.join(Detail).group_by(Report.id).order_by(Report.study,'SeverityCount')
print("SQL QUERY IS: ",reports)
result = reports_schema.dump(reports)
print("RESULT RECEIVED: ",result )
return {"reports": result}
...但收到的结果总是显示 SQL QUERY IS: SELECT report.project AS report_project,report.study AS report_study,detail.severity AS detail_severity,count(detail.severity) AS "SeverityCount"
FROM report JOIN detail ON report.id = detail.report_id GROUP BY report.id ORDER BY report.study,"SeverityCount"
(如果我从架构中删除 details: []
,则根本不显示)...
default=[],
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。