1.写好配置文件
今天来和大家一块学习下SQLAlchemy的外键约束。我们先添加一个config.py用来写连接MySQL的参数。代码如下。
DIALECT = 'mysql' # 要用的什么数据库
DRIVER = 'pymysql' # 连接数据库驱动
USERNAME = 'root' # 用户名
PASSWORD = 'root' # 密码
HOST = 'localhost' # 服务器
PORT = '3306' # 端口
DATABASE = 'db_demo3' # 数据库名
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
这里咱们新建了一个数据库叫db_demo3.sql语句如下
create database db_demo3;
创建好数据库之后,导入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()
然后添加几条记录。如下
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()
然后咱们如何获取文章名为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)
挺麻烦的,这时候就该外键约束登场了,先把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的强大。完整代码如下。数据库等需要自行调整。
app.py
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()
好了,就说这么多。
Study hard and make progress every day.
更多学习资料请关注"爱游戏爱编程"。
爱游戏爱编程.jpg
网友评论