Flask-SQLAlchemy已经写了单表和一对多关系的增删改查,最后咱们来写完最后的多对多查询。
多对多关系是关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。
首先理解什么是多对多关系,还是和图书有关的。我们拿作者和图书来做例子,一本书可以有多个作者,一个作者可以有多本书 ,这样就可以确定它们是多对多的关系了。
应该如何处理多对多的关系,一般情况下靠这两张表是不能把它们关联起来,所以要请外援。
我们在去创建一个表,把这两个表的主键给连接起来,形成第三张表。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
class Config:
DEBUG = True # 开启debug
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/csdn' # 数据库连接地址
SQLALCHEMY_TRACK_MODIFICATIONS = False # 取消动态最终
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) # id
name = db.Column(db.String(30), nullable=False) # 名字
phone_num = db.Column(db.Integer, nullable=False) # 手机号
books = db.relationship('Book', backref='author')
def __repr__(self): # 格式化输出
return f'作者:{self.name},手机号:{self.phone_num}。'
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) # id
title = db.Column(db.String(30), nullable=False) # 书名
price = db.Column(db.Integer, nullable=False) # 金额
to_aut = db.Column(db.Integer, db.ForeignKey("author.id")) # 外键
def __repr__(self):
return f'书名:{self.title},价格:{self.price}。'
class AuthorBook(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
book_id = db.Column(db.Integer,
db.ForeignKey("book.id"))
author_id = db.Column(db.Integer,
db.ForeignKey("author.id"))
def __repr__(self):
return '书的id是%s,作者的id是%s' % (self.book_id, self.author_id)
@app.route('/')
def hello_world(): # put application's code here
return ''
if __name__ == '__main__':
db.create_all()
app.run()
我们建立了AuthorBook表,并把作者和书籍表的主键id作为表的字段,这样表就创建完成了。再然后我们要去给relationship增加一个关键字参数叫做secondary它的作用是指名多对多关系中的第三张表,这时候我们就把它加上。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
class Config:
DEBUG = True # 开启debug
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/csdn' # 数据库连接地址
SQLALCHEMY_TRACK_MODIFICATIONS = False # 取消动态最终
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) # id
name = db.Column(db.String(30), nullable=False) # 名字
phone_num = db.Column(db.Integer, nullable=False) # 手机号
books = db.relationship('Book', backref='author', secondary='author_book')
def __repr__(self): # 格式化输出
return f'作者:{self.name},手机号:{self.phone_num}。'
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) # id
title = db.Column(db.String(30), nullable=False) # 书名
price = db.Column(db.Integer, nullable=False) # 金额
to_aut = db.Column(db.Integer, db.ForeignKey("author.id")) # 外键
def __repr__(self):
return f'书名:{self.title},价格:{self.price}。'
class AuthorBook(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
book_id = db.Column(db.Integer,
db.ForeignKey("book.id"))
author_id = db.Column(db.Integer,
db.ForeignKey("author.id"))
def __repr__(self):
return '书的id是%s,作者的id是%s' % (self.book_id, self.author_id)
@app.route('/')
def hello_world(): # put application's code here
# 找到天龙八部的作者
res = Book.query.filter_by(title='天龙八部').first().author
print(res)
return '成功'
if __name__ == '__main__':
db.create_all()
app.run()
注意表的名字是以数据里表的名字为表明,类名字有时候并不是表名。最后我们往数据表中加上数据就可以搜索了。