【PythonWeb开发】Flask连接数据库以及执行数据迁移

一、连接数据库

        在Flask中可以使用 Flask-SQLAlchemy 扩展来连接数据库。如果你选择不同的数据库或 ORM,初始化和配置的方式可能会有所不同。下面给出三种常见数据库的连接示例:

(1)连接MySQL数据库

        使用Flask-SQLAlchemy即可实现对MySQL数据库的连接,但首先得安装相应的库

pip install flask-sqlalchemy pymysql

        Flask-SQLAlchemy是对原生的 SQLAlchemy的拓展,提供了一些方便的快捷方式和集成点,使它在 Flask 应用中更为常用。pymysql是MySQL的驱动,让Python操作MySQL数据库成为可能。

# exts.py中连接数据库要安装一些插件
"""
用于ORM:pip install flask-sqlalchemy

用于数据迁移:pip install flask-migrate

用于MySQL驱动:pip install pymysql
"""

# 插件的使用方法可以总结成三步:

# 1. 导入第三方插件
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

# 2. 实例化插件对象
db = SQLAlchemy()
migrate = Migrate()

# 3. 绑定app
def init_exts(app):

    db.init_app(app=app)  # 初始化数据库插件
    migrate.init_app(app=app, db=db)  # 初始化迁移插件,并关联数据库插件

在对应的子应用App文件夹里创建__init__.py文件。并配置数据库连接:

# 在__init__.py中导入Flask库
from flask import Flask
# 从当前目录下的views模块中导入blue对象
from .views import blue
# 从当前目录下面的exts模块中导入初始化插件函数
from .exts import init_exts


# 定义一个创建应用的函数
def create_app():
    # 创建一个Flask应用实例
    app = Flask(__name__)
    
    # 注册蓝图,将blue对象注册到app上
    app.register_blueprint(blueprint=blue)

    # 设置数据库连接URI
    DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(
        USERNAME,
        PASSWORD,
        HOSTNAME,
        PORT,
        DATABASE
    )  # 这是连接MySQL数据库的设置


    # 将数据库连接URI配置到app的配置中
    app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
    # 关闭SQLAlchemy的事件系统,提高性能
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    # 初始化插件
    init_exts(app)

    # 返回创建好的Flask应用实例
    return app

(2)连接SQLite数据库

        使用Flask-SQLAlchemy即可实现对SQLite数据库的连接,配置连接 SQLite 数据库非常简单:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# 设置数据库连接URI
DB_URI = 'sqlite:///sqlite3.db'  # 要改这个地方'sqlite:///这是你数据库的名字.db'
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
db = SQLAlchemy(app)

(3)连接MongoDB数据库

        安装 Flask-PyMongo 或 pymongo可以实现对MongoDB数据库的连接

pip install flask flask-pymongo pymongo

        首先导入了必要的Flask和pymongo库。然后,我们创建了一个Flask实例,并且配置了一个MONGO_URI配置项来定义MongoDB的连接字符串和数据库名。接下来,我们创建了一个MongoClient实例,用于与MongoDB交互。

from flask import Flask
from flask_pymongo import PyMongo

app = Flask(__name__)
DB_URI = 'mongodb://username:password@localhost:27017/myDatabase'
app.config['MONGO_URI'] = DB_URI
mongo = PyMongo(app)

        在实际应用中,替换 'username:password@localhost' 以及 'dbname''myDatabase' 等占位符为你的实际数据库凭据和名称。

        使用 mongo = PyMongo(app) 创建的 mongo 对象,可以非常方便地与 MongoDB 数据库进行交互。这个对象提供了很多方法来执行 CRUD 操作(创建 Create、读取 Read、更新 Update、删除 Delete)。下面是一些基本的使用示例:

① 访问集合

users = mongo.db.users

② 插入文档

# 创建一个新用户字典,包含用户名、电子邮件和加入时间
new_user = {
    "username": "Alice",
    "email": "alice@example.com",
    "joined_on": datetime.utcnow()
}

# 将新用户插入到数据库的users集合中
insert_result = users.insert_one(new_user)

# 打印插入操作的结果,显示新用户的ID
print(f"Inserted ID: {insert_result.inserted_id}")

③ 查询文档

# 查询所有用户
all_users = users.find()
for user in all_users:
    print(user)

# 根据条件查询
user_by_email = users.find_one({"email": "alice@example.com"})
print(user_by_email)

④ 更新文档

# 更新一个文档,将email为"alice@example.com"的用户的username字段设置为"Alicia"
update_result = users.update_one(
    {"email": "alice@example.com"},  # 查询条件:查找email为"alice@example.com"的用户
    {"$set": {"username": "Alicia"}}  # 更新操作:设置username字段为"Alicia"
)

# 打印修改的文档数量
print(f"Modified count: {update_result.modified_count}")  # 输出修改的文档数量

⑤ 删除文档

# 删除用户名为"Alicia"的用户记录,并返回删除结果
delete_result = users.delete_one({"username": "Alicia"})

# 打印删除的记录数
print(f"Deleted count: {delete_result.deleted_count}")

二、数据迁移

        在 Flask 中执行数据库迁移,通常会使用 Flask-Migrate 扩展,它是基于 Alembic 的一个简单包装器,用于处理数据库迁移。以下是如何使用 Flask-Migrate 执行数据迁移的基本步骤:

 (1)安装Flask-Migrate

pip install Flask-Migrate

(2)初始化Flask-Migrate

        以SQLite为例,在 Flask 应用中初始化Flask-Migrate

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
URI = 'sqlite:///example.db'  # 请根据实际情况替换为你的数据库URI
app.config['SQLALCHEMY_DATABASE_URI'] = URI
db = SQLAlchemy(app)

# 初始化 Flask-Migrate
migrate = Migrate(app, db)

(3)四条迁移命令

  • flask db init

        初始化迁移环境,这是第一次设置时需要执行的操作,它会在你的项目中创建一个迁移脚本的目录。

flask db init
  • flask db migrate

        生成迁移脚本,每当你的模型有变动时,都需要执行此命令来生成迁移脚本。

flask db migrate -m "Migration message describing the changes"

-m 参数后面跟着的是对此次迁移的简短描述,这将被用作迁移脚本的名称。 

  • flask db upgrade

应用迁移,使用此命令来应用实际的数据库变更。

flask db upgrade
  • flask db downgrade

如果你需要撤销最近的迁移,可以使用以下命令

flask db downgrade

        默认情况下,这会撤销最后一次迁移。如果你想回滚到更早的版本,可能需要指定回退到的具体版本号。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

08:结构体

结构体 1、为什么需要结构体2、如何定义结构体3、怎么使用结构体变量3.1、赋值和初始化3.2、结构体变量的输出 1、为什么需要结构体 为了表示一些复杂的事物,而普通的基本类型无法满足实际要求。什么叫结构体 把一些基本类型数据组合在一起形成的一个新的数据类型&…

深入剖析Tomcat(十四) Server、Service 组件:如何启停Tomcat服务?

通过前面文章的学习,我们已经了解了连接器,四大容器是如何配合工作的,在源码中提供的示例也都是“一个连接器”“一个顶层容器”的结构。并且启动方式是分别启动连接器和容器,类似下面代码 connector.setContainer(engine); try …

DP V2.1a标准学习

一、说明 DP是DisplayPort的简写,是视频电子标准协会(VESA)标准化的数字式视频接口标准,可用于板内芯片之间的连接,也可用于输出接口连接外部设备。DisplayPort是一种基于数据包的可扩展协议,用于传输视频和音频数据。DisplayPort 具有高度可扩展性,并具有保持向后兼容…

【一步一步了解Java系列】:对这个系列的总结以及对缺漏内部类知识的补充

看到这句话的时候证明:此刻你我都在努力 加油陌生人 br />个人主页:Gu Gu Study专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xf…

大模型微调新范式:当LoRA遇见MoE

©PaperWeekly 原创 作者 | 陈思硕 单位 | 北京大学 研究方向 | 自然语言处理 图片 当 LoRA 遇见 MoE,会擦出怎样的火花? 图片 ▲ 左侧:原始版本的 LoRA,权重是稠密的,每个样本都会激活所有参数;右…

第二节:如何使用thymeleaf渲染html(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;今天来学习如何使用thymeleaf渲染html。该模板运用不广泛&#xff0c;所以本节内容了解既可。 第一步&#xff1a;创建html文件。 在模板templates目录下创建一个html文件。 编写代码如下&#xff1a; <!DOCTYPE html> <…

Sentinel如何使用BlockExceptionHandler实现限流/降级错误页面显示

1、修改配置项&#xff0c;打开对Spring MVC端点的保护 spring.cloud.sentinel.filter.enabledtrue 2、编写 BlockExceptionHandler的实现类 MyUrlBlockHandler.java package com.codex.terry.sentinel.urlblockhandler;/*** 文件名称: MyUrlBlockHandler.java* 编写人: yh…

tf1问题记录

在复现一个开源项目https://github.com/macanv/BERT-BiLSTM-CRF-NER。有一个疑似TensorFlow-gpu、cudnn、cuda之间版本不兼容的问题。问题详情如下&#xff1a; 在base中输入nvidia-smi显示无此命令&#xff1a; 输入nvitop可正常显示&#xff1a; 输入nvcc -V显示为&#x…

机器学习——强化学习状态值函数V和动作值函数Q的个人思考

最近在回顾《西瓜书》的理论知识&#xff0c;回顾到最后一章——“强化学习”时对于值函数部分有些懵了&#xff0c;所以重新在网上查了一下&#xff0c;发现之前理解的&#xff0c;包括网上的大多数对于值函数的描述都过于学术化、公式化&#xff0c;不太能直观的理解值函数以…

SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution

CVPR2024 香港理工大学&OPPO&bytedancehttps://github.com/cswry/SeeSR?tabreadme-ov-file#-licensehttps://arxiv.org/pdf/2311.16518#page5.80 问题引入 因为有些LR退化情况比较严重&#xff0c;所以超分之后的结果会出现语义的不一致的情况&#xff0c;所以本文训…

AI影像测量:开启测量仪器的智能之眼

在基于机器视觉的影像测量中&#xff0c;一些复杂特征传统测量需要人工手动选点测量&#xff0c;不仅易受到人为因素的干扰&#xff0c;而且极大的降低测量效率&#xff0c;提高了人力成本和生产成本。AI影像测量技术运用先进的机器视觉和深度学习算法&#xff0c;可快速、准确…

工程技术类SCI,低分快刊首选期刊,无版面费!

1、期刊概况 【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR2区&#xff0c;中科院4区&#xff1b; 【检索情况】SCIE在检 【版面类型】正刊&#xff0c;仅少量版面&#xff1b; 【出刊频率】年刊 2、征稿范围 本刊主要是发表有关能源转型和可再生能源需求相关的研究文…

如何用程序批量下载小红书的图片?

如何使用MediaCrawler快速下载图片 作为一名图像算法工程师&#xff0c;怎么能没有图片资源呢&#xff1f;今天&#xff0c;我要介绍一个能快速下载图片的方法&#xff0c;仅供学习使用&#xff0c;请勿用于其他用途。 下载项目 首先&#xff0c;从GitHub下载项目&#xff1…

Zabbix 排坑版 Centos7

systemctl stop firewalld;systemctl disable firewalld;setenforce 0sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configzabbix源地址,可以自己选版本&#xff0c;安装都大差不差 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5…

Codeforces Round 955 (Div. 2) A~E

A.Soccer&#xff08;思维&#xff09; 题意&#xff1a; 迪马喜欢看足球比赛。在这样一场比赛中&#xff0c;记分牌上的比分表示为 x x x: y y y&#xff0c;其中 x x x是第一队的进球数&#xff0c; y y y是第二队的进球数。在任何时候&#xff0c;只有一支球队可以进球&am…

超声波清洗机怎么选?极力推荐四款口碑大牌超声波清洗机

相信大家都知道超声波清洗机&#xff0c;每次眼镜脏的时候&#xff0c;去眼镜店里让老板帮忙清洗&#xff0c;她们用的就是超声波清洗机&#xff0c;通过超声波的原理深入物品深处清洁&#xff0c;清洁效果非常好。相对手洗的方式&#xff0c;超声波清洗机能够保护镜片在清洗过…

jq实现拖动滑块实现人机校验——基础积累

最近在写后台管理系统&#xff0c;同事遇到一个需求关于滑动验证的。之前的样式是&#xff1a; 现在只要底部的滑动验证&#xff0c;图片不要了&#xff0c;而且要滑动到右边才算是验证通过。 就是如下所示的最简单的验证方式&#xff1a; 由于同事现有的项目是mvc的&#…

昇思25天学习打卡营第1天|yulang

今天主要了解了深度学习框架之昇思MindSpore的初学入门&#xff0c;没想到 ai学习入门如此简单&#xff0c;不愧是华为大手笔&#xff0c;提供的学习环境配置如此之高。这个平台有点类似百度飞桨&#xff0c;大大降低了AI开发门槛&#xff0c;使用户能够快速实现想要的模型&…

Dinky 让Flink作业纵享丝滑

1.Dinky是什么&#xff1f; Dinky 是一个开箱即用的一站式实时计算平台&#xff0c;以 Apache Flink 为基础&#xff0c;连接 OLAP 和数据湖等众多框架,致力于流批一体和湖仓一体的建设与实践。Dinky 让Flink作业纵享丝滑&#xff0c;为 Apache Flink 深度定制的新一代实时计算…

【Python机器学习】模型评估与改进——留一法交叉验证

留一法也是一种常见的交叉验证方法。 我们可以将留一法交叉验证看作是每折只包含单个样本的k折交叉验证。对于每次划分&#xff0c;选择单个数据点作为测试集。这种方法可能非常耗时&#xff0c;特征是对于大型数据&#xff0c;但是小型数据集上有时可以给出更好的估计结果&am…