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

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()

注意表的名字是以数据里表的名字为表明,类名字有时候并不是表名。最后我们往数据表中加上数据就可以搜索了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿汤哥798

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值