资讯专栏INFORMATION COLUMN

6.ORM与SQLAlchemy (2) - 模型关系与引用

libin19890520 / 2437人阅读

摘要:承接上文,我们的,除了用户表,还需要存储所有问题内容的表和存储所有评论的表,并且都和通过外键来关联。我们不排除后续需要更多表的可能性,把所有模型和视图函数写在一起看着也太混乱了为此,我们新建一个,把三个模型都放在这里。

承接上文,我们的Q&A demo,除了用户表,还需要存储所有问题内容的表questions_info和存储所有评论的表comments_info,并且都和users_info通过外键来关联。我们不排除后续需要更多表的可能性,把所有模型和视图函数写在一起看着也太混乱了!为此,我们新建一个models.py,把三个模型都放在这里。


由于是新建的models.py文件,我们同样要先在开头生成一个名为dbSQLAlchemy对象:

</>复制代码

  1. from flask_sqlalchemy import SQLAlchemy
  2. db = SQLAlchemy()

前文中我们给SQLAlchemy传入了Flask对象app作为参数,这里是不是也要从视图函数文件HarpQA.py导入那个app并传进去呢?并不可以,因为HarpQA.py也要使用到db(如db.session),这样就产生了循环引用,所以在这里不能传入app,而是回到HarpQA.py,使用db.init_app(app)appdb绑定,避免了循环引用。


users_info表(Users模型)代码如下:

</>复制代码

  1. class Users(db.Model):
  2. __tablename__ = "users_info"
  3. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  4. username = db.Column(db.String(32), nullable=False)
  5. password = db.Column(db.String(100), nullable=False)
  6. register_time = db.Column(db.DateTime, nullable=False, default=datetime.now())
  7. # 我们新增了一个avatar_path字段来存用户头像图片文件的路径
  8. avatar_path = db.Column(db.String(256), nullable=False, default="images/doraemon.jpg")

questions_info表(Questions模型)代码如下:

</>复制代码

  1. class Questions(db.Model):
  2. __tablename__ = "questions_info"
  3. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  4. title = db.Column(db.String(100), nullable=False)
  5. content = db.Column(db.TEXT, nullable=False)
  6. author_id = db.Column(db.Integer, db.ForeignKey("users_info.id"))
  7. create_time = db.Column(db.DateTime, nullable=False, default=datetime.now())
  8. author = db.relationship("Users", backref=db.backref("questions", order_by=create_time.desc()))

这个表存储所有问题的标题、内容、创建时间、作者ID,作者ID通过外键与用户表的ID关联,方式也很简单,在db.Column中用db.ForeignKey("users_info.id")作为参数即可。
再看最后一条语句:

</>复制代码

  1. author = db.relationship("Users", backref=db.backref("questions", order_by=create_time.desc()))

db.relationship会自动找到两个表的外键,建立QuestionsUsers的关系,此时对于任意一个Questions对象question,通过question.author就可获得这个question的作者对应的Users对象,例如获取id1的问题的作者姓名:

</>复制代码

  1. question = Questions.query.filter(Questions.id == 1).first()
  2. author_name = question.author.username

db.relationship的第二个参数backref=db.backref("questions", order_by=create_time.desc())则建立了一个反向引用,这样我们不仅可以使用question.author,还可以使用author.questions获得一个作者所有的问题,并通过order_by=create_time.desc()按创建时间倒序排列(网页的内容按时间倒序排列),返回的是一个Questions对象的列表,可以遍历它获取每个对象,如获取作者Harp的所有问题的title

</>复制代码

  1. author = Users.query.filter(Users.username == "Harp").first()
  2. for question in author.questions:
  3. print(question.title)

同理,comments_info表(Comments模型)代码如下:

</>复制代码

  1. class Comments(db.Model):
  2. __tablename__ = "comments_info"
  3. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  4. content = db.Column(db.TEXT, nullable=False)
  5. question_id = db.Column(db.Integer, db.ForeignKey("questions_info.id"))
  6. author_id = db.Column(db.Integer, db.ForeignKey("users_info.id"))
  7. create_time = db.Column(db.DateTime, nullable=False, default=datetime.now())
  8. author = db.relationship("Users", backref=db.backref("comments"))
  9. question = db.relationship("Questions", backref=db.backref("comments", order_by=create_time.desc()))

HarpQA.py中,我们要从models.py导入db所有的模型,注意因为上下文的关系,我们这里用with语句把app推入栈中:

</>复制代码

  1. from flask import Flask, render_template
  2. from models import db, Users, Questions, Comments
  3. import config
  4. app = Flask(__name__)
  5. app.config.from_object(config)
  6. db.init_app(app)
  7. with app.test_request_context():
  8. db.drop_all()
  9. db.create_all()
  10. @app.route("/")
  11. def index():
  12. return render_template("home.html")
  13. if __name__ == "__main__":
  14. app.run()

运行脚本,此时数据库已经把三张表都建立好了:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41230.html

相关文章

  • Python-SQLAlchemy:第3节:关系操作

    摘要:本节围绕在中如何定义关系及如何使用关系进行查询进行讲解,使读者能够快速掌握的关系操作。班级与学生为一对多关系,班级与老师之间为多对多关系。三年二班多对多关系的使用通过关联模型实现,在其中分别设置模型和的外键,并且在父模型中设置相应的实现。 上一篇文章:Python-SQLAlchemy:第2节:查询条件设置下一篇文章:Python-SQLAlchemy:第4节:级联 关系数据库是建立...

    William_Sang 评论0 收藏0
  • Flask Web Development —— 数据库(上)

    摘要:数据库关系数据库将数据保存在表中来模拟应用程序中不同的实体。这些行之间的连接称作关系,也是关系数据库模型的基础。就像这个示例中看到的那样,关系数据库存储数据高效且避免重复。最好的例子就是,支持一组关系数据库引擎,包括流行的和。 数据库就是有组织的存储应用程序数据,然后查询检索指定需要的那部分。大部分web应用程序都采用基于关系模型的数据库,也称作结构化查询语言(SQL)数据库。但是最近...

    skinner 评论0 收藏0
  • 13.首页内容展示

    摘要:发布问答界面与功能以及完成了,我们要把用户发布的内容在首页展示出来,逻辑也是很简单,在请求的时候,从中获取所有的数据,在中使用循环将每一个对象的内容写上去。 发布问答界面与功能以及完成了,我们要把用户发布的内容在首页展示出来,逻辑也是很简单,在请求home.html的时候,从Questions中获取所有的数据,在home.html中使用for循环将每一个对象的内容写上去。将home视图...

    Drummor 评论0 收藏0
  • Flask Web Development —— 数据库(上)

    摘要:数据库关系数据库将数据保存在表中来模拟应用程序中不同的实体。这些行之间的连接称作关系,也是关系数据库模型的基础。就像这个示例中看到的那样,关系数据库存储数据高效且避免重复。最好的例子就是,支持一组关系数据库引擎,包括流行的和。 数据库就是有组织的存储应用程序数据,然后查询检索指定需要的那部分。大部分web应用程序都采用基于关系模型的数据库,也称作结构化查询语言(SQL)数据库。但是最近...

    rockswang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<