SQLAlchemy外键约束

当在SQLAlchemy中创建模型后,若需添加外键属性,需先删除已有表并重新运行。本文讨论外键的用法,如何实现通过模型访问关联数据,以及定义反向引用以获取所有相关文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在创建一个模型的时候,一旦生成一个表,就无法在模型中添加属性,此时的解决办法是,先在数据库中删除这张表drop tables article;。然后重新运行。

1.外键:

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

class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    content = db.Column(db.Text, nullable=False)

    author = db.relationship('User',backref=db.backref('articles'))#正向与反向引用

2.author = db.relationship('User',backref=db.backref('articles'))解释:
*给Article这个模型添加一个author属性,可以访问这篇文章的作者的数据,像访问普通模型一样。
*backref是定义反向引用,可以通过User.articles访问这个模型所写的所有文章。

db1.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
import pymysql
pymysql.install_as_MySQLdb()

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

# 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)
#
# db.create_all()

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

class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    content = db.Column(db.Text, nullable=False)

    author = db.relationship('User',backref=db.backref('articles'))#正向与反向引用

db.create_all()

@app.route('/')
def hello_world():
    #添加一个用户
    # user1 = User(username='xww')
    # db.session.add(user1)
    # db.session.commit()

    # 添加一个文章
    # article = Article(title='aaa',content='bbb',author_id=1)
    # db.session.add(article)
    # db.session.commit()

    # 找文章标题为aaa的作者
    # article = Article.query.filter(Article.title=='aaa').first()
    # author_id = article.author_id
    # user = User.query.filter(User.id==author_id).first()
    # print(user.username)

    # 正向与反向引用
    #查找作者为xww的所有文章
    # article.author
    # author = User.query.filter(User.name == 'xww').first()
    # author.articles

    # article = Article(title='aaa', content='bbb')
    # article.author = User.query.filter(User.id==1).first()
    # db.session.add(article)
    # db.session.commit()

    # 找文章标题为aaa的作者
    # article = Article.query.filter(Article.title == 'aaa').first()
    # print(article.author.username)

    # 查找作者为xww的所有文章
    # article = Article(title='111',content='222',author_id=1)
    # db.session.add(article)
    # db.session.commit()
    user = User.query.filter(User.username == 'xww').first()
    result = user.articles
    for article in result:
        print('-'*10)
        print(article.title)

    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值