首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Flask-SQLAlchemy进行查询

使用Flask-SQLAlchemy进行查询
EN

Stack Overflow用户
提问于 2014-08-16 03:31:17
回答 3查看 14.4K关注 0票数 3

我正在使用Flask构建一个RESTful应用程序接口,并使用SQLAlchemy将我的应用程序连接到MySQL数据库。

我在数据库中有两个模型: Order和Order_line。订单由多个订单行组成。每个订单行都有一个关联的状态。

我在将SQL请求转换为Flask-SQLAlchemy语句时遇到了问题。我尤其对加入感到厌烦。

以下是我的模型:

代码语言:javascript
运行
复制
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_line的status_id不同于1的所有订单(因此检索Order.id)。

SQL查询将为

代码语言:javascript
运行
复制
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之间的区别感到困惑。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-16 06:38:07

您可以使用.any()

代码语言:javascript
运行
复制
Order.query.filter(Order.lines.any(Order_line.status_id != 1))
票数 2
EN

Stack Overflow用户

发布于 2014-08-16 06:25:10

我对Flask-SQLAlchemy也是个新手,但我最近在我的应用程序中学到了很多东西。然后,一些可能对你有帮助的观点:

“vanilla”和Flask-SQLAlchemy之间的主要区别在于Flas-SQLAlchemy处理会话变量的方式。在Flask版本中,您有一个db对象来处理您的会话,如下所示:

代码语言:javascript
运行
复制
  db = SQLAlchemy()

有了这个对象,您就可以处理查询。在您的例子中,您的查询可以通过以下方式执行:

代码语言:javascript
运行
复制
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“更改为"Query.id”。你拥有的"like“过滤器我不完全确定如何在Flask-SQLAlchemy中实现它,但我发现了这个问题,它回答了"vanilla”SQLalchemy:how to pass a not like operator in a sqlalchemy ORM query

票数 2
EN

Stack Overflow用户

发布于 2016-12-31 01:38:31

还可以使用

代码语言:javascript
运行
复制
db.session.query(Order.id).filter(Order.lines.status_id != 1 ).group_by(Order.id).all()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25332972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档