簡體   English   中英

使用 Flask-SQLAlchemy 查詢

[英]Querying with Flask-SQLAlchemy

我正在使用 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_line 的 status_id 不同於 1 的訂單(因此檢索 Order.id)。

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 包裝器和“原版”SQLAlchemy 之間的區別感到特別困惑。

我也是 Flask-SQLAlchemy 的新手,但我最近為我的應用程序學習了很多東西。 然后,有一點可以幫助你:

'vanilla' 和 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”更改為“Query.id”。 您擁有的“like”過濾器我不完全確定如何在 Flask-SQLAlchemy 中實現它,但我發現這個問題為“vanilla”SQLalchemy 執行了一個答案: 如何在sqlalchemy ORM 查詢中傳遞一個不喜歡的運算符

您可以使用.any()

Order.query.filter(Order.lines.any(Order_line.status_id != 1))

還可以用

db.session.query(Order.id).filter(Order.lines.status_id != 1 ).group_by(Order.id).all()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM