Flask-SQLAlchemy外键及其关系

tech2023-07-02  127

1、写配置文件

DIALECT = 'mysql' # 要用的什么数据库 DRIVER = 'pymysql' # 连接数据库驱动 USERNAME = 'root' # 用户名 PASSWORD = 'root' # 密码 HOST = 'localhost' # 服务器 PORT = '3306' # 端口 DATABASE = 'db_demo1' # 数据库名 SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE) SQLALCHEMY_TRACK_MODIFICATIONS = False

2、使用sqlyog新建一个db_demo1的数据库

3、导入SQLAlchemy,在创建两个类。

一个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()

4、添加几条数据:

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()

5、获取文章名为aaa 作者

先找到,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)

6、代码冗杂,麻烦,这时候可使用外键约束,

先把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()
最新回复(0)