首页 > 其他分享 >flask多表查询操作的两种方法(使用外键和不使用外键)

flask多表查询操作的两种方法(使用外键和不使用外键)

时间:2024-03-14 12:33:56浏览次数:18  
标签:多表 flask db 外键 查询 Column User id

1使用外键:

在Flask中使用Flask-SQLAlchemy进行连表查询时,可以通过定义模型的外键关系来实现。下面是一个如何定义模型和进行连表查询的示例:

首先,定义两个模型:

from flask_sqlalchemy import SQLAlchemy

# 初始化SQLAlchemy
db = SQLAlchemy()

# 用户模型
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

# 文章模型
class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    content = db.Column(db.Text)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    author = db.relationship('User', back_populates='articles')

# 用户和文章的关系通过外键author_id建立
# User模型不需要额外的定义来建立关系,因为它自动拥有了backref 'articles'

接着,使用Flask-SQLAlchemy进行连表查询:

# 假设我们有一个用户和他的文章列表
user = User.query.filter_by(email='[email protected]').first()

# 查询该用户的文章
articles = user.articles
for article in articles:
    print(f"Title: {article.title}")

在上面的例子中,我们定义了一个外键author_idArticle模型中指向User模型的主键id。同时,我们使用了db.relationshipArticle模型中建立了与User模型的双向关联,这样就可以通过user.articles来获取用户的所有文章。

如果你想使用原生SQL进行查询,可以使用session.query来构建复杂的查询:

# 使用原生SQL进行连表查询
query = db.session.query(User, func.count(Article.id).label('num_articles'))
       .outerjoin(Article, User.id == Article.author_id)
       .group_by(User.id)
       .all()

# 输出每个用户的ID和他们的文章数量
for user, num_articles in query:
    print(f"User ID: {user.id}, Number of Articles: {num_articles}")

在这个例子中,我们使用outerjoinUserArticle表进行了连接,并通过group_by对查询结果进行了分组,最后通过all()获取结果。这样就可以得到每个用户的ID以及他们写的文章数量。

2.不使用外键

在Flask-SQLAlchemy中,即便不使用外键,依然可以通过SQLAlchemy的查询功能来实现表之间的关联查询。以下是如何在不定义外键的情况下,通过SQLAlchemy进行连表查询的一个示例:

首先,定义两个模型(假设这两个模型没有设置外键关系):

class Account(db.Model):
    __tablename__ = 'account'
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String())

class Bind(db.Model):
    __tablename__ = 'bind'
    id = db.Column(db.Integer, primary_key=True)
    account_id = db.Column(db.Integer)
    other_id = db.Column(db.Integer)

接下来,可以使用SQLAlchemy的join方法来进行表连接查询。例如,要查询账户及其绑定的信息,可以这样写:

# 创建一个查询对象
query = db.session.query(Account, Bind)

# 通过on关键字指定连接的条件
query = query.join(Bind, Account, Account.id == Bind.account_id)

# 执行查询并迭代结果
for account, bind in query.all():
    print(f"Account: {account.nickname}, Bind ID: {bind.id}, Other ID: {bind.other_id}")

在上述代码中,join方法用于根据指定的条件连接AccountBind两个表。Account.id == Bind.account_id是连接的条件,表示根据账户ID来关联查询。

需要注意的是,虽然可以在不使用外键的情况下进行连表查询,但这并不是数据库设计的最佳实践。外键不仅能够帮助数据库保证引用完整性,还能够让ORM更方便地处理关联对象。如果没有外键,就需要开发者自己确保关联条件的正确性,这增加了出错的可能性。因此,在实际开发中,推荐使用外键来明确表与表之间的关系。

标签:多表,flask,db,外键,查询,Column,User,id
From: https://blog.csdn.net/weixin_43284441/article/details/136706635

相关文章

  • python基于flask房产中介房屋供求系统django毕业设计项目lw附源码
    本设计要设计一个简单的网页,在研究的过程中具体有以下5个步骤:下面简要分析房产中介系统的业务:(1)注册、登录:注册普通账号登录。(2)用户个人信息修改:登录后可以修改用户的基本信息,也可以退出。(3)用户留言管理:用户填写留言的主题、联系人、电话、邮箱、留言内容。 (4)房屋......
  • 多表查询
    内连接,外连接,自连接,隐式/显示内/外连接这些开发过程中经常使用就不说了。一、联合查询unionSELECT字段列表FROM表A...UNION[ALL]SELECT字段列表FROM表B...UNIONALL会有重复结果,UNION不会联合查询比使用or效率高,不会使索引失效二、子查询1where是分组之前进......
  • Python学习笔记-Flask实现简单的投票程序
    1.导入flask包 fromflaskimportFlask,jsonify,abort,make_response,request,render_template2.初始化Flask应用:app=Flask(__name__)3. 定义投票种类data=[{'id':0,'name':'劳动节','num':0},{'id':1,'name&#......
  • Flask框架基础介绍
    Flask是一个轻量级的PythonWeb应用框架,它简单而灵活,适用于快速开发Web应用程序。Flask基于WerkzeugWSGI工具箱和Jinja2模板引擎构建,提供了简单易用的方式来构建Web应用程序和RESTfulAPI。以下为Flask框架的基础知识和常用用法。1、安装Flask在开始之前,首......
  • flask_09days
    常用查询fromsqlalchemy.ormimportsessionmakerfromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportscoped_sessionfrommodelsimportUsers,Person,Hobby,Boy,Girlfromsqlalchemy.sqlimporttextengine=create_engine("mysql+pymysql://root:l......
  • flask-sqlalchemy模块的使用
    flask-sqlalchemy集成到flask中1下载模块pipinstallflask-sqlalchemy--upgrade2__init__文件中导入模块fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__,template_folder='../templates',static_folder='../static'......
  • flask08_days
    一对多关系 关系importdatetimefromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportdeclarative_base,relationshipfromsqlalchemyimportColumn,Integer,String,Text,ForeignKey,DateTime,UniqueConstraint,IndexBase=declarative_base()#......
  • MYSQL学习笔记23: 多表查询(自连接内连接+左右外连接)
    多表查询(自连接)自连接查询,可以是内连接查询,也可以是外连接查询select字段列表from表A别名Ajoin表A别名Bon条件...;自连接内连接查询员工以及所属领导的名字#可以这样写selecte1.name'员工',e2.name'上司'fromempe1joinempe2one1.man......
  • MYSQL学习笔记24: 多表查询(联合查询,Union, Union All)
    多表查询(联合查询,union,unionall)union查询需要多张表的列数一致,字段类型也保持一致对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集select字段列表from表A...union[all]select字段列表from表B...;查询出薪资低于10000,或年龄......
  • MYSQL学习笔记25: 多表查询(子查询)[标量子查询,列子查询]
    多表查询(子查询)子查询,也称嵌套查询子查询的语句可以是insert/update/delete/select中的任何一个根据子查询的结果不同,可以分为:标量子查询(结果为单个值)列子查询(结果为一列)行子查询(子查询结果为一行)表子查询(子查询结果为多行多列)select*fromt1wh......