当前位置: 首页>编程语言>正文

python flask api 多个参数 查询sql flask sqlalchemy多表查询

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

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

python flask api 多个参数 查询sql flask sqlalchemy多表查询,python flask api 多个参数 查询sql flask sqlalchemy多表查询_flask,第1张

 

python flask api 多个参数 查询sql flask sqlalchemy多表查询,python flask api 多个参数 查询sql flask sqlalchemy多表查询_外键_02,第2张

 

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

 这就是关于一查多表操作的增删改查


https://www.xamrdz.com/lan/5sj1934620.html

相关文章: