我正在使用Flask构建RESTful api并使用SQLAlchemy将我的应用程序连接到MySQL数据库。
我在数据库中有两个模型:Order和Order_line。订单由多个订单行组成。每个订单行都有一个相关的状态。
我在将SQL请求转换为Flask-SQLAlchemy语句时遇到问题。我特别被加入了。
以下是我的模特:
class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
date_created = db.Column(db.DateTime)
lines = db.relationship('Order_line',
backref=db.backref('order',
lazy='join'))
def __init__(self, po):
self.date_created = datetime.datetime.now()
class Order_line(db.Model):
id = db.Column(db.Integer, primary_key=True)
order_id = db.Column(db.Integer, db.ForeignKey('order.id'))
status_id = db.Column(db.Integer, db.ForeignKey('status.id'))
def __init__(self, order_id):
self.order_id = order_id
self.status_id = 1
class Status(db.Model):
id = db.Column(db.Integer, primary_key=True)
short_name = db.Column(db.String(60))
description = db.Column(db.String(400))
lines = db.relationship('Order_line',
backref=db.backref('status',
lazy='join'))
def __init__(self, short_name, description):
self.short_name = short_name
self.description = description
基本上,我想要检索所有订单(因此检索Order.id),这些订单的一个或多个order_line的status_id与1不同。
SQL查询将是
SELECT id FROM `order`
INNER JOIN order_line
ON order.id=order_line.order_id
WHERE
order_line.status_id NOT LIKE 1
GROUP BY
order.id
我没有找到将SQL语句转换为SQLAlchemy命令的方法。我对Flask-SQLAlchemy包装器和'vanilla'SQLAlchemy之间的区别感到特别困惑。
答案 0 :(得分:1)
我在Flask-SQLAlchemy中也是新手,但我最近为我的应用学习了很多东西。然后,有一点可以帮助你:
'香草'之间的主要区别而Flask-SQLAlchemy此刻要做一个查询,它是Flas-SQLAlchemy处理会话变量的方式。在Flask版本中,您有一个db对象来处理会话,如下例所示:
db = SQLAlchemy()
使用该对象,您可以处理查询。在您的情况下,您的查询可以这样执行:
db.session.query(Order).filter(Order.id==Order_line.order_id).filter(Order_line.status_id!=1).group_by(Order.id).all()
这不是完全相同的查询,但它非常相似。它将返回Order表中的所有字段,但如果您只想要" id",则可以更改" Order" for" Query.id"在查询语句中。 "喜欢"你有过滤器我不完全确定如何在Flask-SQLAlchemy中实现它,但我发现这个问题可以为" vanilla" SQLalchemy:how to pass a not like operator in a sqlalchemy ORM query
答案 1 :(得分:1)
您可以使用.any()
:
Order.query.filter(Order.lines.any(Order_line.status_id != 1))
答案 2 :(得分:0)
也可以使用
db.session.query(Order.id).filter(Order.lines.status_id != 1 ).group_by(Order.id).all()