SQLAlchemy外鍵關(guān)聯(lián)使用及其詳細(xì)說(shuō)明

SQLAlchemy數(shù)據(jù)庫(kù)增刪改查 http://www.itdecent.cn/p/b7704b6cb2ee
ORM是需要了解的:Object-Relational Mapping,把關(guān)系數(shù)據(jù)庫(kù)的表結(jié)構(gòu)映射到對(duì)象上,在Python中,ORM框架是SQLAlchemy。

這里用簡(jiǎn)單的兩張表來(lái)記錄SQLAlchemy數(shù)據(jù)庫(kù)關(guān)聯(lián)的使用。

首先創(chuàng)建在User模型創(chuàng)建了一張表,表名為“user”

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)

然后在模型Article中創(chuàng)建了一張名為“article”的表

class Article(db.Model):
    __tablename__ = 'article'
    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('user.id'))
    author = db.relationship('User', backref=db.backref('articles'))

這里將User中的id關(guān)聯(lián)到Article中的author_id,也就是author_id就是User中的id。
關(guān)聯(lián)的時(shí)候數(shù)據(jù)類型要保持一致,如db.Integer??梢酝ㄟ^(guò)Navicat for MySQL中的ER圖標(biāo)來(lái)查看。

author_id = db.Column(db.Integer, db.ForeignKey('user.id'))

這里我在User表中添加了3條數(shù)據(jù):



在Article中添加了2條數(shù)據(jù),這兩條數(shù)據(jù)是綁定在劉備下的


添加的代碼如下:

    username = request.args.get("username")
    user = User(username=username)
    db.session.add(user)
    db.session.commit()
    title = request.args.get("title")
    content = request.args.get("content")
    aitlcle = Article(title=title, content=content, author_id=1)
    db.session.add(aitlcle)
    db.session.commit()

準(zhǔn)備工作完成了,外鍵肯定是關(guān)聯(lián)成功了,可以通過(guò)運(yùn)行代碼來(lái)查看:

查看title為“如何收復(fù)漢室?”的這個(gè)作者是誰(shuí)

    article = Article.query.filter(Article.title == '如何收復(fù)漢室?').first()
    author_id = article.author_id
    user = User.query.filter(User.id == author_id).first()

下面這種寫(xiě)法更簡(jiǎn)單,在Article中如此:

author = db.relationship('User', backref=db.backref('articles')):

第一個(gè)參數(shù)為模型User的名字(class User),這個(gè)是正向引用, Article引用User
第二個(gè)參數(shù)為反向引用,User引用Article

# 查找劉備還寫(xiě)過(guò)哪些文章    正向引用  Article引用User
    article = Article.query.filter(Article.title == '如何收復(fù)漢室?').first()
    print('username:%s' % article.author.username)

上面通過(guò)正向引用,也就是Article引用User來(lái)得到title為“如何收復(fù)漢室?”的這個(gè)作者是誰(shuí),打印結(jié)果為:

username:劉備

實(shí)現(xiàn)了正向引用,來(lái)看看反向引用,比如劉備還發(fā)表了哪些文章,即User引用Article:

    user = User.query.filter(User.username == '劉備').first()
    articles = user.articles    #此處直接反向引用得到所有的文章
    for article in articles:
        print(article.title)

打印結(jié)果:

如何收復(fù)漢室?
等紙

Flask-SQLAlchemy外鍵多對(duì)多關(guān)系 http://www.itdecent.cn/p/5282a7525e52

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容