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) # 打印作者的所有文章的标题

你可能感兴趣的:(python-Flask_SQLAlchemy(3))