簡體   English   中英

Flask Sqlalchemy:用外鍵查詢數據庫

[英]Flask Sqlalchemy: Query a database with a foreign key

I am still learning flask sqlalchemy but am working on a dashboard using flask, mysql workbench, and sqlalchemy. 我想查詢兩個表:

class User(db.Model):
    id = Column(Integer(), primary_key=True)
    name = Column(String(200))
    first_name = Column(String(200))

class Certificates(db.Model):
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey("user.id", 
    ondelete="CASCADE"))
    report_sent = Column(Boolean, default=False)
    delivery_time = Column(DateTime)
    certificate_type = Column(String(32))

我想知道擁有證書的用戶總數

我試過了:

user_with_cert = db.session.query(func.count(User.id)).filter(Certificates.certificate_type != None).filter(Certificates.user_id == User.id).all()

上面的查詢返回的是證書表中的記錄總數,而不是實際持有證書的用戶數。

我也試過:

user_cert = (
            db.session.query(User, Certificates)
            .join(Certificates)
            .all()
        )

        for user, cert in b2c_cert:
            t = db.session.query(func.count(user.id)).filter(
                cert.user_id == user.id).filter(cert.certificate_type != None).all()
            print(t)

請問我怎樣才能實現這個目標?

您需要在 backref 屬性標識父表的父表上使用 db.relationship('Child table', backref='parent') 。 並且 db.ForeignKey(table.primary_key) class 在您的子表的列上。

例子:

class User(db.Model):
    id = Column(Integer(), primary_key=True)
    name = Column(String(200))
    first_name = Column(String(200))
    certificates = db.relationship('Certificates', backref='user')

class Certificates(db.Model):
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('user.id', 
    ondelete="CASCADE"))
    report_sent = Column(Boolean, default=False)
    delivery_time = Column(DateTime)
    certificate_type = Column(String(32))

然后你可以使用

db.session.query(Certifiates).filter(Certifiates.user_id == user.id).all()

得到結果(我認為這是正確的條件,可能不是那樣)。

所以我通過添加一個 db.relationship 來修改我的表來反向引用父表中的父級:

class User(db.Model):
    id = Column(Integer(), primary_key=True)
    name = Column(String(200))
    first_name = Column(String(200))
    certificates = db.relationship('Certificates', backref='user')

Certificates.user_id 中的當前記錄是 (1, 1, 2, 1, 2):我認為記錄的總數是 5,但擁有證書的用戶總數是 2 所以我運行了這個查詢,它給了我一個不同的數字擁有證書的用戶:

users_with_cert = db.session.query(Certificates.user_id).distinct().count()

歡迎提出建議,因為我認為此查詢是正確的,但僅適用於分配給證書的用戶,可能不一定是擁有證書的用戶

暫無
暫無

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

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