成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

6.ORM與SQLAlchemy (2) - 模型關(guān)系與引用

libin19890520 / 2365人閱讀

摘要:承接上文,我們的,除了用戶表,還需要存儲(chǔ)所有問(wèn)題內(nèi)容的表和存儲(chǔ)所有評(píng)論的表,并且都和通過(guò)外鍵來(lái)關(guān)聯(lián)。我們不排除后續(xù)需要更多表的可能性,把所有模型和視圖函數(shù)寫在一起看著也太混亂了為此,我們新建一個(gè),把三個(gè)模型都放在這里。

承接上文,我們的Q&A demo,除了用戶表,還需要存儲(chǔ)所有問(wèn)題內(nèi)容的表questions_info和存儲(chǔ)所有評(píng)論的表comments_info,并且都和users_info通過(guò)外鍵來(lái)關(guān)聯(lián)。我們不排除后續(xù)需要更多表的可能性,把所有模型和視圖函數(shù)寫在一起看著也太混亂了!為此,我們新建一個(gè)models.py,把三個(gè)模型都放在這里。


由于是新建的models.py文件,我們同樣要先在開頭生成一個(gè)名為dbSQLAlchemy對(duì)象:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

前文中我們給SQLAlchemy傳入了Flask對(duì)象app作為參數(shù),這里是不是也要從視圖函數(shù)文件HarpQA.py導(dǎo)入那個(gè)app并傳進(jìn)去呢?并不可以,因?yàn)?b>HarpQA.py也要使用到db(如db.session),這樣就產(chǎn)生了循環(huán)引用,所以在這里不能傳入app,而是回到HarpQA.py,使用db.init_app(app)appdb綁定,避免了循環(huán)引用。


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

class Users(db.Model):
    __tablename__ = "users_info"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(32), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    register_time = db.Column(db.DateTime, nullable=False, default=datetime.now())
    # 我們新增了一個(gè)avatar_path字段來(lái)存用戶頭像圖片文件的路徑
    avatar_path = db.Column(db.String(256), nullable=False, default="images/doraemon.jpg")    

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

class Questions(db.Model):
    __tablename__ = "questions_info"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.TEXT, nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey("users_info.id"))
    create_time = db.Column(db.DateTime, nullable=False, default=datetime.now())

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

這個(gè)表存儲(chǔ)所有問(wèn)題的標(biāo)題、內(nèi)容、創(chuàng)建時(shí)間、作者ID,作者ID通過(guò)外鍵與用戶表的ID關(guān)聯(lián),方式也很簡(jiǎn)單,在db.Column中用db.ForeignKey("users_info.id")作為參數(shù)即可。
再看最后一條語(yǔ)句:

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

db.relationship會(huì)自動(dòng)找到兩個(gè)表的外鍵,建立QuestionsUsers的關(guān)系,此時(shí)對(duì)于任意一個(gè)Questions對(duì)象question,通過(guò)question.author就可獲得這個(gè)question的作者對(duì)應(yīng)的Users對(duì)象,例如獲取id1的問(wèn)題的作者姓名:

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

db.relationship的第二個(gè)參數(shù)backref=db.backref("questions", order_by=create_time.desc())則建立了一個(gè)反向引用,這樣我們不僅可以使用question.author,還可以使用author.questions獲得一個(gè)作者所有的問(wèn)題,并通過(guò)order_by=create_time.desc()按創(chuàng)建時(shí)間倒序排列(網(wǎng)頁(yè)的內(nèi)容按時(shí)間倒序排列),返回的是一個(gè)Questions對(duì)象的列表,可以遍歷它獲取每個(gè)對(duì)象,如獲取作者Harp的所有問(wèn)題的title

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

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

class Comments(db.Model):
    __tablename__ = "comments_info"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    content = db.Column(db.TEXT, nullable=False)
    question_id = db.Column(db.Integer, db.ForeignKey("questions_info.id"))
    author_id = db.Column(db.Integer, db.ForeignKey("users_info.id"))
    create_time = db.Column(db.DateTime, nullable=False, default=datetime.now())

    author = db.relationship("Users", backref=db.backref("comments"))
    question = db.relationship("Questions", backref=db.backref("comments", order_by=create_time.desc()))

HarpQA.py中,我們要從models.py導(dǎo)入db所有的模型,注意因?yàn)樯舷挛牡年P(guān)系,我們這里用with語(yǔ)句把app推入棧中:

from flask import Flask, render_template
from models import db, Users, Questions, Comments

import config

app = Flask(__name__)
app.config.from_object(config)

db.init_app(app)

with app.test_request_context():
    db.drop_all()
    db.create_all()


@app.route("/")
def index():
    return render_template("home.html")


if __name__ == "__main__":
    app.run()

運(yùn)行腳本,此時(shí)數(shù)據(jù)庫(kù)已經(jīng)把三張表都建立好了:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41230.html

相關(guān)文章

  • Python-SQLAlchemy:第3節(jié):關(guān)系操作

    摘要:本節(jié)圍繞在中如何定義關(guān)系及如何使用關(guān)系進(jìn)行查詢進(jìn)行講解,使讀者能夠快速掌握的關(guān)系操作。班級(jí)與學(xué)生為一對(duì)多關(guān)系,班級(jí)與老師之間為多對(duì)多關(guān)系。三年二班多對(duì)多關(guān)系的使用通過(guò)關(guān)聯(lián)模型實(shí)現(xiàn),在其中分別設(shè)置模型和的外鍵,并且在父模型中設(shè)置相應(yīng)的實(shí)現(xiàn)。 上一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置下一篇文章:Python-SQLAlchemy:第4節(jié):級(jí)聯(lián) 關(guān)系數(shù)據(jù)庫(kù)是建立...

    William_Sang 評(píng)論0 收藏0
  • Flask Web Development —— 數(shù)據(jù)庫(kù)(上)

    摘要:數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在表中來(lái)模擬應(yīng)用程序中不同的實(shí)體。這些行之間的連接稱作關(guān)系,也是關(guān)系數(shù)據(jù)庫(kù)模型的基礎(chǔ)。就像這個(gè)示例中看到的那樣,關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)高效且避免重復(fù)。最好的例子就是,支持一組關(guān)系數(shù)據(jù)庫(kù)引擎,包括流行的和。 數(shù)據(jù)庫(kù)就是有組織的存儲(chǔ)應(yīng)用程序數(shù)據(jù),然后查詢檢索指定需要的那部分。大部分web應(yīng)用程序都采用基于關(guān)系模型的數(shù)據(jù)庫(kù),也稱作結(jié)構(gòu)化查詢語(yǔ)言(SQL)數(shù)據(jù)庫(kù)。但是最近...

    skinner 評(píng)論0 收藏0
  • 13.首頁(yè)內(nèi)容展示

    摘要:發(fā)布問(wèn)答界面與功能以及完成了,我們要把用戶發(fā)布的內(nèi)容在首頁(yè)展示出來(lái),邏輯也是很簡(jiǎn)單,在請(qǐng)求的時(shí)候,從中獲取所有的數(shù)據(jù),在中使用循環(huán)將每一個(gè)對(duì)象的內(nèi)容寫上去。 發(fā)布問(wèn)答界面與功能以及完成了,我們要把用戶發(fā)布的內(nèi)容在首頁(yè)展示出來(lái),邏輯也是很簡(jiǎn)單,在請(qǐng)求home.html的時(shí)候,從Questions中獲取所有的數(shù)據(jù),在home.html中使用for循環(huán)將每一個(gè)對(duì)象的內(nèi)容寫上去。將home視圖...

    Drummor 評(píng)論0 收藏0
  • Flask Web Development —— 數(shù)據(jù)庫(kù)(上)

    摘要:數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在表中來(lái)模擬應(yīng)用程序中不同的實(shí)體。這些行之間的連接稱作關(guān)系,也是關(guān)系數(shù)據(jù)庫(kù)模型的基礎(chǔ)。就像這個(gè)示例中看到的那樣,關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)高效且避免重復(fù)。最好的例子就是,支持一組關(guān)系數(shù)據(jù)庫(kù)引擎,包括流行的和。 數(shù)據(jù)庫(kù)就是有組織的存儲(chǔ)應(yīng)用程序數(shù)據(jù),然后查詢檢索指定需要的那部分。大部分web應(yīng)用程序都采用基于關(guān)系模型的數(shù)據(jù)庫(kù),也稱作結(jié)構(gòu)化查詢語(yǔ)言(SQL)數(shù)據(jù)庫(kù)。但是最近...

    rockswang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<