接上回的单表操作后现在又遇到了问题,一对多的情况如何操作表。
先来整理下思路,什么情况下的表是一对多的操作。比如我要创建两个表,一个是作者表(Author)另一个是书籍表(BOOK),这两个表的关系就是一对多。
一个书只有一个出版社,一个出版社可以有多本书
我们把这个理清楚了就可以来创建表了,创建表的代码的如下
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 Press(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) # 手机号
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) # 金额
@app.route('/')
def hello_world(): # put application's code here
return '成功'
if __name__ == '__main__':
db.create_all()
app.run()
我这里只是先创建了两个表,里面写了表基本的字段,现在让它们关联起来
在一对多的关系中我们如果要把两个表关联起来,我们会在多的一方创建一个外键连接到一的那张表
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 Press(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) # 手机号
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_pre = db.Column(db.Integer, db.ForeignKey("press.id")) # 外键
@app.route('/')
def hello_world(): # put application's code here
return '成功'
if __name__ == '__main__':
db.create_all()
app.run()
关联起来也就是加上一个字段,里面用ForeignKey外键指定到另一个表的主键,也就是作者表的id就行了。
现在来一个需求,我要查询天龙八部的出版社id
res = Book.query.filter_by(title='天龙八部').first().to_pre print(res)
这样的查询其实有时候麻烦了,每次还要在多的那一方增加一个字段,如果字段多了那就会增加更多的工作量。‘’
这其中有一个属性叫做relationship
它的作用也是把两个表关联起来,但他和加外键有一个区别,它并不会在表中生成这么一个字段。(它是要在一的一方,建立跟多的那一方的关联属性)
并且它也有一个关键字参数叫做backref,它的作用是回溯到这张表,这个意思是你在backref中给一个名字,在被关联的那张表中你查询这张表中的字段就可以用这个backref中给的名字,下面是代码演示
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 Press(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='press')
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("press.id")) # 外键
def __repr__(self):
return f'书名:{self.title},价格:{self.price}。'
@app.route('/')
def hello_world(): # put application's code here
# 查询南京出版社出版的所有书
res = Press.query.filter_by(name='南京出版社').first().books
# 查询天龙七部的出版社
res1 = Book.query.filter_by(title='天龙七部').first().press
print('查询南京出版社出版的所有书', res)
print('查询天龙七部的出版社', res1)
return '成功'
if __name__ == '__main__':
db.create_all()
app.run()
我在这段代码中演示了relationship的用法,首先是在一的一方设置连接到多的一方,其次根据第一参数给的是关系表的名字,第二个位置参数backref则是方便关系表的反响查找。
这就是关于一查多表操作的增删改查