python-Flask_SQLAlchemy(3)

外键约束

[TOC]

创建外键约束表结构

有两个表,用户表(users)与文章表(article)。其中文章表中的作者id是来自用户表的id,即外键关系

  1. 用户表:
# mysql
create table users(
    id int primary key autoincrement,
    username varchar(100) not null
)
# python模型映射
class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
  1. 文章表
 # mysql
 create table article (
     id int primary key autoincrement,
     title varchar(100) not null,
     content text not null,
     author_id int,
     foreign key 'author_id' references 'users.id'
 )
# python模型映射
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('users.id')) # 设置外键约束

查找文章作者

方法一:

    # 首先查找文章标题为"aaa"的文章对象,该对象里面有作者id
    article = Article.query.filter(Article.title == 'aaa').first() 
    # 然后根据作者id,由外键关系获取到用户的名字--作者名字
    author_id = article.author_id
    user = Users.query.filter(Users.id == author_id).first()
    # 打印出作者名字
    print('username:%s' % user.username)

方法二:

  1. 修改python模型映射方法

    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('users.id'))
        author = db.relationship('Users', backref=db.backref('articles')) # 反向引用的方法
    
    
  2. 查找文章作者

    article = Article.query.filter(Article.title == 'aaa').first()
    print('username:%s' % article.author)
    

列出某作者所有文章

文章类需要有反向引用的方法 即author = db.relationship('Users', backref=db.backref('articles'))

user = Users.query.filter(Users.username=='Jyang').first()  # 获取作者
result = user.articles   # 获取作者写过的所有文章
for article in result:
    print(article.title) # 打印作者的所有文章的标题
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容