flask入门-3.Flask操作数据库

news2024/9/25 15:23:54

3. Flask操作数据库

1. 连接数据库

首先下载 MySQL数据库

其次下载对应的包:

pip install pymysql
pip install flask-sqlalchemy

在 app.py 中进行连接测试

from flask import Flask, request, render_template
from flask_sqlalchemy import SQLAlchemy

hostname = "127.0.0.1"
port = 3306
username = "root"
password = "root"

database = "flask_learn"

# 在 app.config 中设置连接数据库的信息
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{username}:{password}@{hostname}:{port}/{database}?charset=utf8mb4"
# 使用SQLAlchemy(app)创建一个db对象
# 此时SQLAlchemy辉自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)

with app.app_context():
    with db.engine.connect() as conn:
        rs = conn.execute("select 1")
        print(rs.fetchone())    # 输出1说明连接成功, 0说明连接不成功


if __name__ == '__main__':
    app.run(debug=True)

2. ORM模型与表的映射(直接使用代码操作数据库)

在app.py中:

# 定义User类
class User(db.Model):
    # 声明该实体类和数据库中的user表对应
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)

with app.app_context():
    db.create_all() # 创建表

3. ORM的CRUD操作

在 app.py 中, 对 user 表进行 CRUD 操作

3.1 添加数据

# ORM的CRUD操作
@app.route('/user/add')
def add_user():
    # 1. 创建ORM对象
    user = User(username = '111', password = '111')
    # 2. 将ORM对象添加到 db.session 中
    db.session.add(user)
    # 3. 将db.session 同步到数据库中
    db.session.commit()
    return "添加用户成功"

3.2 查找数据

根据主键查找

@app.route('/user/query')
def query_user():
    # 1. 根据主键查找
    user = User.query.get(1)
    print(user.username, user.password)
    return "查找用户成功"

filter_by 查找

@app.route('/user/query2')
def query_user2():
    # 2. filter_by 查找
    # 返回值是Query数组
    users = User.query.filter_by(username = '111')
    for user in users:
        print(user.username, user.password)
    return "查找用户成功"

3.3 更新数据

@app.route('/user/update')
def update_user():
    user = User.query.filter_by(username = '111').first()
    user.password = '222'
    db.session.commit()
    return "更新用户成功"

3.4 删除数据

@app.route('/user/delete')
def delete_user():
    # 1. 根据主键查找
    user = User.query.get(1)
    db.session.delete(user)
    db.session.commit()
    return "删除用户成功"

4. ORM中外键与数据库表的关系

假设,一个用户可以发表多篇文章,用户与文章是一对多的关系,因此在 article 表中有外键 author_id 对应 user的 id

定义用户类 user 与文章类 article 如下:

# 定义User类
class User(db.Model):
    # 声明该实体类和数据库中的user表对应
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    # 创建user表与article表之间的关联关系, 从而可以使得User的对象user通过 user.articles 获得对应的 article 对象的列表 articles
    articles = db.relationship("Article", back_populates="author")

class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    # 添加文章对应的作者的外键
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    # 创建两个表之间的关联关系, 从而可以使得Article的对象article通过 article.author 获得对应的 user 对象
    author = db.relationship("User", back_populates="articles")

关联两个表的另一种方式:

# 定义User类
class User(db.Model):
    # 声明该实体类和数据库中的user表对应
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    

class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    # 添加文章对应的作者的外键
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    # 创建两个表之间的关联关系, 从而可以使得Article的对象article通过 article.author 获得对应的 user 对象, 同时 user 会 自动与article 关联, 通过 user.articles 获得对应的 article 对象的列表 articles
    author = db.relationship("User", backref="articles")

查询某个用户的所有文章:

@app.route('/article/add')
def add_article():
    article1 = Article(title="aaa", content="aaaaaaaaaaaa")
    article1.author = User.query.get(2)
    article2 = Article(title="bbb", content="bbbbbbbbbbbb")
    article2.author = User.query.get(2)

    # 添加到session中
    db.session.add_all([article1, article2])
    db.session.commit()
    return "添加文章成功"


@app.route('/articles/query')
def query_articles():
    # 查找某用户的所有文章
    user = User.query.get(2)
    articles = user.articles
    for article in articles:
        print(article.title, article.content, article.author.username)

    return "查找用户id为2的所有文章成功"

5. 数据库表中字段改变

首先安装包 flask-migrate

pip install flask-migrate

然后在 app.py 中

from flask_migrate import Migrate
hostname = "127.0.0.1"
port = 3306
username = "root"
password = "root"

database = "flask_learn"

# 在 app.config 中设置连接数据库的信息
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{username}:{password}@{hostname}:{port}/{database}?charset=utf8mb4"
# 使用SQLAlchemy(app)创建一个db对象
# 此时SQLAlchemy辉自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)
migrate = Migrate(app, db)

接下来需要将整个项目的所有 ORM实体类 映射到 数据库表中

  1. 在控制台执行 flask db init (一个项目执行一次)

    执行结果:

    image-20230224233333145

    1. 在控制台执行 flask db migrate , 识别ORM模型的改变(即识别字段的增删), 生成迁移脚本

      迁移脚本在 migrate文件夹下的version文件夹下

    2. 在控制台执行 flask db upgrade, 运行迁移脚本,同步到数据库中

只要后端代码对ORM模型(即实体类的属性)进行改变,就需要执行 2和3,从而将其映射到数据库中,使得数据库中的对应字段进行改变

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Facebook广告投放运营中的关键成功因素是什么?

在当今数字化的时代,广告投放已经成为了各种企业获取市场份额和增加品牌曝光的重要手段之一。Facebook作为全球最大的社交媒体平台之一,其广告投放运营的成功,将直接影响企业的品牌推广和市场营销效果。本文将探讨Facebook广告投放运营中的关…

浅谈光流跟踪之KLT稀疏光流跟踪算法

0 简介 在学习vins-mono过程中,算法前端采用基于KLT光流的跟踪方法,对光流和KLT光流进行简单的总结。包括LK光流跟踪算法原理,基于金字塔改进的LK光流跟踪,KLT光流跟踪算法,以及在光流跟踪时使用的角点检测算法Harris…

追梦之旅【数据结构篇】——详解C语言实现链队列

详解C语言实现链队列~😎前言🙌整体实现内容分析💞预备小知识🙌1.链队列头文件编写🙌2.链队列功能文件(Queue.c )编写:🙌1)初始化函数实现2)销毁函…

【一些回忆】2022.02.26-2023.02.26 一个普通男孩的365天

💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:一些回忆 为什么选择在这个时间节点回忆一下呢? 一是因为今天距离2023高考仅剩1…

华为OD机试题,用 Java 解【删除字符串中出现次数最少的字符】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

Linux内核内存相关问题,这一篇让你彻底了解

linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用…

排错工具ping和trace(电子科技大学TCP/IP实验四)

一.实验目的 1、了解网络连通性测试的方法和工作原理 2、了解网络路径跟踪的方法和工作原理 3、掌握 MTU 的概念和 IP 分片操作 4、掌握 IP 分组生存时间(TTL)的含义和作用 5、掌握路由表的作用和路由查找算法 二.预备知识 …

[SQL Statements] 基本的SQL知识 之DDL针对数据库的基本操作

SQL Statements SQL语句的学习 之 DDL针对数据库的基本操作 什么是database 在 MySQL 中,Database(数据库)是一组有组织的数据集合,可以存储和管理相关数据的容器。一个数据库可以包含多个表(Table)&…

如何用 chatGPT,给大家来一个自我介绍

大家好,我是不吃西红柿的无线机械键盘,我的名字叫 Keychron K3 Pro。今天,我通过西红柿主人的手,使用 chatGPT 来介绍一下我自己。我的与众不同 我是由精密机械元件制作而成,并采用抗键渗设计,以提供更快、…

电子科技大学网络协议(TCP/IP作业答案)--网工(五次作业汇总)

目录 作业1:OSI/RM、TCP/IP编址和底层网络技术 作业2:IP地址规划与路由选择 作业3:ARP、IP、ICMP 作业4:UDP、Routing Protocol 作业五 作业1:OSI/RM、TCP/IP编址和底层网络技术 物理地址属于OSI/RM的哪一层&…

关于Linux内存管理的详细介绍,这篇万字长文值得你的收藏点赞

Linux内存管理一、Linux内存管理概述1.1 什么是内存管理1.2 内存管理的重要性1.3 内存管理的组成部分二、物理内存管理2.1 什么是物理内存2.2 物理内存管理方式2.2.1 连续内存管理2.2.2 非连续内存管理2.3 物理内存管理相关的函数及示例三、虚拟内存管理3.1 什么是虚拟内存3.2 …

HTML常用基础内容总结

文章目录一、对HTML的感性认知前置知识什么是web前端,什么是web后端前端技术栈、后端技术栈开发与运行的区别浏览器的功能是什么简介写一个简单可运行的的html代码前端开发方式二、VSCode的简单使用三、常用的HTML标签最最基本的HTML结构HTML代码特点注释标签标题标…

「JVM 高效并发」Java 内存模型

Amdahl 定律代替摩尔定律成为了计算机性能发展的新源动力,也是人类压榨计算机运算能力的最有力武器; 摩尔定律,描述处理器晶体管数量与运行效率之间的发展关系;Amdahl 定律,描述系统并行化与串行化的比重与系统运算加…

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?如何打败面试官?如何拿下那梦寐以求的offer? 如果你的跳槽意向已经很确定,那么请往下…

【python量化】大幅提升预测性能,将NSTransformer用于股价预测

写在前面NSTransformer模型来自NIPS 2022的一篇paper《Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting》。NSTransformer的目的主要是为了解决其他方法出现过平稳化处理的问题。其通过提出序列平稳化以及去平稳化注意力机制可以使得模型…

我眼中的柔宇科技

关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:李肖遥很早就知道了柔宇科技,当时是因为知道创始人刘自鸿,23岁清华本硕毕业,26岁获斯坦福大学电子工程博士学位,历时不超过3年&#x…

你真的了解环形队列吗?(学习数据结构必须掌握的模型)

目录 0.前言 1. 什么是环形队列 2. 如何使用数组结构 / 链表结构 对环形队列封装 3. 代码手撕环形队列各个接口 3.1 代表封装一个环形队列 3.2 环形队列的初始化 3.3 环形队列的插入 3.4环形队列的删除 3.5环形队列的判空 3.6环形队列的判满 3.7环形队列的队头 3.8环…

NCNN量化详解2

1 NCNN量化算法简介 量化算法介绍的文章的话,下面这篇文章的大佬 @章小龙 介绍的比我好多啦。虽然介绍的是NVIDIA TensorRT的算法,但是NCNN是参考其算法做出来的,方法几乎一样 首先NVIDIA有一个PPT,很好的阐述了他们的方案,推荐大家也去看一下: https://link.zhihu.com…

我来了,RK第七届开发者大会

大家好,我是发哥的朋友windsnake「也是发哥文章里面经常出现的邓总」。今年终于是有时间参加了一次Rk的开发者大会,这篇文章记录下自己的所见所闻,算是对自己福州之行的一次总结。从深圳出发月亮还没睡醒的早上,坐5号线杀到深圳北…

【项目设计】高并发内存池(二)[高并发内存池整体框架设计|threadcache]

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…