Flask-数据库

本文展示了如何使用Python的Flask框架和SQLAlchemy库进行数据库操作,包括配置数据库连接、创建模型类以及执行增删改查操作。示例代码涵盖了单表操作和多对多关系的处理,涉及出版社、图书和作者之间的关联。同时,通过路由实现了对数据的查询和添加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单表

from flask_sqlalchemy import SQLAlchemy


class Config:
    DEBUG=True
    SQLALCHEMY_DATABASE_URI="mysql://root:123456@127.0.0.1:3306/demo3"
    SQLALCHEMY_TRACK_MODIFICATIONS = False

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
#模型类-对表设计
class Publishers(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64))
    address = db.Column(db.String(64))
	@app.route("/")
	def index():
    #增
    # res = Book(title = "玛卡巴卡",price = 12)
    # res_1 = Publishers(name = "菜鸟出版",address = "家里蹲")
    # db.session.add(res)
    # db.session.commit()
    return "ok"


if __name__ == '__main__':
    db.create_all()
    #db.drop_all()删除当前库内所有的表
    app.run(debug=True)`

config那里对MySQL配置进行启动的前提,SQLALCHEMY_DATABASE_URI与SQLALCHEMY_TRACK_MODIFICATIONS 没有配置,只是进行简单的flask——hello world输出,它确实能输出到127.0.01,只是404Can’t find。而且开启debug的时候,下面就会出现 这两个报错类似的提醒。此时就需要去配置了。

ctrl+The left mouse button(鼠标左键)查看SQLAlchemy源码,就会有提示有
app = Flask(name)
db = SQLAlchemy(app)
直接就可以代入代码之中。至于
app.config.from_object(Config)为什么要在
db = SQLAlchemy(app)之后写,是为了解决在代码运行之间把配置类给db先配置上,因为代码有从上至下的执行的顺序。所以得在中间配置。

  1. 模型类 ,就是对表的设计,也可以说是在库里边创建一个空白表:
    至于怎么设计(创建)表就需要sql语句创建它的结构;
  2. 操作表 ,打开它的路由在里边进行增删改查的sql命令的操作。
    例如:
`#增
    # res = Book(title = "玛卡巴卡",price = 12, pub_id = 1)
    # res_1 = Publishers(name = "菜鸟出版",address = "家里蹲")
    # db.session.add(res)
    # db.session.add(res_1)
    # db.session.commit()`

改查删;后面就需要根据不同的情况去对下面代码进行操作

# res = Book.query.filter(Publishers.name == "菜鸟出版")

一对多

练习完“增删改查”,四个步骤之后就可以开始深一步的学习

#查找出版对应的书籍
    # res = Book.query.filter(Publishers.name == "菜鸟出版").first()
    # shu = Book.query.filter(Book.pub_id == res.pub_id).all()
    # print(shu)
    # ers = Book.query.filter(Book.title == "玛卡巴卡").first().to_Publish
    # print(ers)

一对多:多的一方创建外键,这样可以加快速度上的提升,query.filter()写出你想要查询的东西,再根据它们之间外键的联系进行查询、修改。
如果想要快速查找出需要的数据。可以在第一要查询的(类/表)后面

to_book = db.relationship("Book", backref = "to_Publish")

relationship的快速查找。后面backref,进行对数据的方向查询`## 合理的创建标题,有助于目录的生成

多对多

在多对多关系中,为了更好的查询、搜索。创建第三方表进行表的联查

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


class Config(object):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "mysql://root:数据库密码@127.0.0.1:3306/数据库库名"
    SQLALCHEMY_TRACK_MODIFICATIONS = False


app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)


# 图书表
class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64), nullable=False)
    price = db.Column(db.Integer)
    pub_id = db.Column(db.Integer, db.ForeignKey("publisher.id"))
    # to_pub = db.relationship("Publisher")
    authors = db.relationship("Author", secondary="author__book", backref="books")

    def __repr__(self):
        return "图书名:%s|价格为%s" % (self.title, self.price)


# 出版社表
class Publisher(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    address = db.Column(db.String(64), nullable=False)
    to_books = db.relationship("Book", backref="to_pub")


# 作者表
class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    age = db.Column(db.Integer)


class Author_Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey("author.id"))
    book_id = db.Column(db.Integer, db.ForeignKey("book.id"))


@app.route("/", methods=["GET", "POST"])
def index():
    # 查询南方出版社出版的所有书籍
    # res = Publisher.query.filter_by(name="南方出版社").first().to_books
    # res = Book.query.filter(Book.pub_id == pub.id).all()

    # 查询渣男日记的出版社名
    # book = Book.query.filter_by(title="渣男日记").first()
    # res = Publisher.query.filter_by(id=book.pub_id).
    # res = Book.query.filter_by(title="渣男日记").first().to_pub
    # print(res)

    # 增加
    # new_obj = Author_Book()
    # new_obj.author_id = Author.query.filter_by(name="小黑").first().id
    # new_obj.book_id = Book.query.filter_by(title="渣男日记").first().id
    #
    # new_obj1 = Author_Book()
    # new_obj1.author_id = Author.query.filter_by(name="小川").first().id
    # new_obj1.book_id = Book.query.filter_by(title="渣男日记").first().id
    #
    # db.session.add(new_obj)
    # db.session.add(new_obj1)
    # db.session.commit()
    # res = Book.query.filter_by(title="渣男日记").first().authors
    # print(res)

    # new_book = Book()
    # new_book.title = "20人工日记"
    # new_book.price = 999
    # new_book.pub_id = 1
    # new_book.authors = Author.query.all()
    # db.session.add(new_book)
    # db.session.commit()
    #查询渣男日记的所有作者
    # book = Book.query.filter_by(title="渣男日记").first()
    # book.authors = Author.query.all()
    # db.session.commit()

    # book = Book.query.filter_by(title="金瓶梅").first()
    # book.authors = Author.query.filter_by(name="小黑").first()   # 错误,必须是列表
    # db.session.commit()
    #增
    # new_book = Book()
    # new_book.title = "20人工日记2"
    # new_book.price = 888
    # new_book.pub_id = 1
    # new_book.authors = [Author(name="老五", age=20), Author(name="老liu", age=20)]
    # db.session.add(new_book)
    # db.session.commit()

    # book = Book.query.filter_by(title="20人工日记2").first()
    # db.session.delete(book)
    # db.session.commit()


    res = Author.query.filter_by(name="小黑").first().books

    print(res)
    return "成功!"


if __name__ == '__main__':
    db.create_all()
    app.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值