flask ORM(对象关系映射): Flask-SQLAlchemy 一对多操作(增删改查)

接上回的单表操作后现在又遇到了问题,一对多的情况如何操作表。

先来整理下思路,什么情况下的表是一对多的操作。比如我要创建两个表,一个是作者表(Auth or)另一个是书籍表(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就行了。

flask ORM(对象关系映射): Flask-SQLAlchemy 一对多操作(增删改查)

flask ORM(对象关系映射): Flask-SQLAlchemy 一对多操作(增删改查)

现在来一个需求,我要查询天龙八部的出版社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则是方便关系表的反响查找。

这就是关于一查多表操作的增删改查,欢迎转载

Original: https://blog.csdn.net/weixin_51113819/article/details/124723579
Author: 阿汤哥798
Title: flask ORM(对象关系映射): Flask-SQLAlchemy 一对多操作(增删改查)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/747900/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球