一个User 一个Article,代码如下。其中Article表中有一个author_id 字段,是一个外键,对应User表的中的id。外键写法:
db.ForeignKey(‘user.id’)
# 用户表 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) content = db.Column(db.Text,nullable=False) author_id = db.Column(db.INTEGER,db.ForeignKey('user.id')) db.create_all()先找到,title名为aaa的这条记录中的author_id,然后在去User表中找到这个用户的名字
article = Article.query.filter(Article.title=='aaa').first() user = User.query.filter(User.id==article.author_id).first() print(user.username)先把article表删了,重新创建一个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')) # 反向引用backref 找到该作者做的所有文章其中author = db.relationship(‘User’,backref=db.backref(‘articles’)) 中的author也是一个对象,另外在里面用了一个反向引用,这样就很方便找到 该文章的作者的所有文章。听着有点绕,咱们写段代码就明白了。还是刚才的需求,找到标题为aaa的作者名字。代码如下。
# 找到文章标题为aaa的作者 article = Article.query.filter(Article.title=='aaa').first() print(article.author.username)还是先把从article表中找到的记录放到article中,然后用article.author.username直接就可以获取作者名字,是不是比刚才方便了一些。如果说要找到该作者写的所有文章该怎么去查询?代码如下,
user = User.query.filter(User.username=='zhangsan').first() result = user.articles for article in result: print("-"*10) print(article.title)这里咱们先从User表中找到zhangsan这个用户,然后注意,直接就可以通过user.articles获得该作者的所有文章,为什么可以用user.articles呢,因为咱们在定义外键约束的时候,写了一个反向引用。这就是SQLAlchemy的强大。完整代码如下。
from flask import Flask from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) # 用户表 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) 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')) # 反向引用backref 找到该作者做的所有文章 db.create_all() @app.route('/') def index(): # user1 = User(username='zhangsan') # db.session.add(user1) # db.session.commit() # # article1 = Article(title='aaa',content='bbb',author_id=1) # db.session.add(article1) # db.session.commit() # article = Article.query.filter(Article.title=='aaa').first() # user = User.query.filter(User.id==article.author_id).first() # print(user.username) # 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) # 找到张三这个用户写过的所有文章 # article = Article(title='111',content='222',author_id=1) # db.session.add(article) # db.session.commit() user = User.query.filter(User.username=='zhangsan').first() result = user.articles for article in result: print("-"*10) print(article.title) return 'index' if __name__ == '__main__': app.run()