1

I am still learning flask sqlalchemy but am working on a dashboard using flask, mysql workbench, and sqlalchemy. I would like to query two tables:

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))

I would like to know the total number of users that has a certificate

I tried:

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

The query above returned the total number of records in the Certificate table not the actual number of users with a certificate.

I also tried:

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)

Please how can I achieve this goal?

2 Answers 2

0

You need to use db.relationship('Child table', backref='parent') on your parent table where the backref property identifies the parent table. And db.ForeignKey(table.primary_key) class on the column from your child table.

Example:

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))

Then you can just use

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

to get the results (I think that's the correct condition, it may not be that way).

Sign up to request clarification or add additional context in comments.

Comments

0

So I modified my table by adding a db.relationship to backref the parent in the parent table:

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')

Present record in the Certificates.user_id is (1, 1, 2, 1, 2): I think the total number of record is 5 but the total number of users with certificate is 2 So I ran this query which gave me a distinct number of users with certificates:

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

Please suggestions are welcomed, cos am thinking this query is right but only for the users assigned to a Certificates, maybe not necessarily the users with a certificate

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.