当前位置: 首页 > news >正文

如何在开发与生产环境中应用 Flask 进行数据库管理:以 SQLAlchemy 和 Flask-Migrate 为例

在使用 Flask 进行开发时,数据库管理是一个至关重要的环节。借助 SQLAlchemy 作为 ORM(对象关系映射)工具和 Flask-Migrate 进行数据库迁移,开发者可以高效地进行数据库管理,并在不同的环境(如开发环境和生产环境)中灵活处理数据库的升级和维护。

本文将介绍如何在 开发环境生产环境 中分别配置和使用 Flask 进行数据库管理。


1. 环境介绍

  • SQLAlchemy:Flask 的 ORM 工具,允许开发者通过 Python 对象与数据库交互,而不需要直接编写 SQL。
  • Flask-Migrate:基于 Alembic 的数据库迁移工具,帮助开发者管理数据库结构的变更。

2. 开发环境中的应用

2.1 项目结构

在开发环境中,项目结构的清晰性和可维护性至关重要。一个典型的 Flask 项目结构如下:

flask_app_a/
│
├── .github/
│   └── workflows/
│       └── main.yml               # GitHub Actions 的工作流配置
│
├── migrations/                    # 数据库迁移相关文件
│   ├── versions/
│   ├── env.py
│   ├── README
│   └── script.py.mako
│
├── models/                        # 数据模型
│   ├── __init__.py
│   └── user.py                    # 各种模型文件
│
├── static/
├── templates/
├── venv/
│
├── app.py                         # Flask 应用入口
├── db.py                          # 数据库初始化逻辑
├── config.py                      # 配置文件
├── Dockerfile
├── gunicorn.conf.py
├── logging_config.py
├── rabbitmq_consumer.py
└── requirements.txt
2.2 配置文件

为方便管理不同的配置环境,通常会创建一个 config.py 文件,来处理开发、测试、生产等不同环境下的配置。

# config.pyimport osclass Config:SQLALCHEMY_TRACK_MODIFICATIONS = FalseSECRET_KEY = os.environ.get('SECRET_KEY') or 'your_secret_key'class DevelopmentConfig(Config):SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(os.getcwd(), 'dev.db')class ProductionConfig(Config):SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:password@host:3306/database?charset=utf8mb4'config = {'development': DevelopmentConfig,'production': ProductionConfig,
}
2.3 初始化数据库

通过 db.py 初始化 SQLAlchemy 和 Flask-Migrate:

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migratedb = SQLAlchemy()def init_db(app):# 配置 SQLAlchemy 和数据库迁移db.init_app(app)Migrate(app, db)
2.4 创建模型

将模型放在 models/ 文件夹下,并在 models/__init__.py 中统一导入所有模型:

# models/user.py
from db import db
from datetime import datetime
from uuid import uuid4class BaseModel(db.Model):__abstract__ = Trueid = db.Column(db.Integer, primary_key=True)created_at = db.Column(db.DateTime, default=datetime.now)updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)class User(BaseModel):__tablename__ = 'user'uuid = db.Column(db.String(13), unique=True, default=uuid4)username = db.Column(db.String(50), unique=True, nullable=False)
# models/__init__.py
from .user import User

2.5 app.py 中集成

确保在 app.py 中初始化数据库并加载模型:

from flask import Flask
from db import init_db
from models import *  # 导入所有模型app = Flask(__name__)# 从配置文件中加载配置
config_name = os.getenv('FLASK_ENV', 'development')
app.config.from_object(f'config.{config_name}')# 初始化数据库
init_db(app)if __name__ == '__main__':app.run()
2.6 本地开发中的数据库迁移

在本地开发中,你可以通过以下步骤进行数据库迁移:

  1. 生成迁移文件: 在本地开发时,当你修改模型时,运行以下命令生成迁移文件:
     

    flask db migrate -m "Initial migration"
    

    2.应用迁移: 生成迁移文件后,运行以下命令将迁移应用到本地数据库:
     

    flask db upgrade
    

3. 生产环境中的配置和应用

在生产环境中,通常不再生成迁移文件,而是应用已经在开发环境中生成的迁移文件。

3.1 迁移文件的提交

在本地生成的迁移文件通常位于 migrations/versions/ 目录中。你需要将这些迁移文件提交到 Git 仓库,这样在生产环境中可以使用这些文件对数据库进行升级。

3.2 使用 GitHub Actions 部署并执行迁移

假设你使用 Docker 和 GitHub Actions 部署 Flask 应用,可以在 Actions 工作流中执行数据库迁移。

name: Build, Push and Deploy Flask Appon:push:branches:- masterjobs:build_and_deploy:runs-on: ubuntu-lateststeps:- name: Check out the repositoryuses: actions/checkout@v2- name: Login to Docker Hubuses: docker/login-action@v1with:username: ${{ secrets.DOCKER_HUB_USERNAME }}password: ${{ secrets.DOCKER_HUB_PASSWORD }}- name: Build the Docker imagerun: docker build . -t ${{ secrets.DOCKER_HUB_USERNAME }}/flask_app:${{ github.sha }}- name: Push the Docker imagerun: docker push ${{ secrets.DOCKER_HUB_USERNAME }}/flask_app:${{ github.sha }}- name: Deploy to serveruses: appleboy/ssh-action@masterwith:host: ${{ secrets.SERVER_HOST }}username: ${{ secrets.SERVER_USER }}key: ${{ secrets.SERVER_SSH_KEY }}script: |docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask_app:${{ github.sha }}docker stop flask_app || true && docker rm flask_app || truedocker run -d --name flask_app -p 5100:5100 ${{ secrets.DOCKER_HUB_USERNAME }}/flask_app:${{ github.sha }}# 执行数据库迁移docker exec flask_app flask db upgrade
3.3 生产环境数据库迁移

在生产环境中,执行数据库迁移的步骤很简单。你只需要通过部署脚本或命令,应用已经提交的迁移文件:
 

flask db upgrade

通过这个命令,数据库会根据你本地生成的迁移文件自动更新表结构。


4. 总结

  • 开发环境: 在开发环境中,你需要频繁地根据模型的变化生成和应用数据库迁移文件,使用 flask db migrateflask db upgrade 来管理数据库的变化。

  • 生产环境: 在生产环境中,你不需要再生成迁移文件,而是使用已经在开发环境中生成的迁移文件,并通过 flask db upgrade 来更新数据库结构。GitHub Actions 可以帮助你在部署时自动执行这一过程。

通过合理的开发流程和生产部署策略,你可以确保 Flask 应用中的数据库始终与模型同步,并且在不同的环境中保持一致。

这样,你就可以轻松地管理 Flask 项目中的数据库,无论是在本地开发,还是在远程生产环境中。

相关文章:

如何在开发与生产环境中应用 Flask 进行数据库管理:以 SQLAlchemy 和 Flask-Migrate 为例

在使用 Flask 进行开发时,数据库管理是一个至关重要的环节。借助 SQLAlchemy 作为 ORM(对象关系映射)工具和 Flask-Migrate 进行数据库迁移,开发者可以高效地进行数据库管理,并在不同的环境(如开发环境和生…...

【Java零基础】Java核心知识点之:Map

HashMap(数组链表红黑树) HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。HashMa…...

9.12日常记录

1.extern关键字 1)诞生动机:在一个C语言项目中,需要再多个文件中使用同一全局变量或是函数,那么就需要在这些文件中再声明一遍 2)用于声明在其他地方定义的一个变量或是函数,在当前位置只是声明,告诉编译器…...

光纤的两种模式

光纤主要分为两种模式:‌‌单模光纤(Single-Mode Fiber, SMF)‌和‌‌多模光纤(Multi-Mode Fiber, MMF)‌。这两种光纤在传输特性、应用场景以及传输距离上存在显著差异。‌12 单模光纤 ‌定义‌:单模光纤…...

SpringMVC的初理解

1. SpringMVC是对表述层(Controller)解决方案 主要是 1.简化前端参数接收( 形参列表 ) 2.简化后端数据响应(返回值) 1.数据的接受 1.路径的匹配 使用RequestMapping(可以在类上或在方法上),支持模糊查询,在内部有method附带…...

Python 基本库用法:数学建模

文章目录 前言数据预处理——sklearn.preprocessing数据标准化数据归一化另一种数据预处理数据二值化异常值处理 numpy 相关用法跳过 nan 值的方法——nansum和nanmean展开多维数组(变成类似list列表的形状)重复一个数组——np.tile 分组聚集——pandas.…...

Android Greendao的数据库复制到设备指定位置

方法如下: private void export() {// 确保您已经请求并获得了WRITE_EXTERNAL_STORAGE权限// 获取要储存的设备路径String picturesDirPath Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();// 在公共目录下创建…...

Ajax 揭秘:异步 Web 交互的艺术

Ajax 揭秘:异步 Web 交互的艺术 一 . Ajax 的概述1.1 什么是 Ajax ?1.2 同步和异步的区别1.3 Ajax 的应用场景1.3.1 注册表单的用户名异步校验1.3.2 内容自动补全 二 . Ajax 的交互模型和传统交互模型的区别三 . Ajax 异步请求 axios3.1 axios 介绍3.1.1 使用步骤3…...

TitleBar:打造高效Android标题栏的新选择

在Android应用开发中,标题栏是用户界面的重要组成部分。一个好的标题栏不仅能够提升应用的专业感,还能增强用户体验。然而,传统的标题栏实现方式往往存在代码冗余、样式不统一、性能开销大等问题。今天,我们将介绍一个名为TitleBa…...

Lua协同程序Coroutine

Lua 协同程序(Coroutine) 定义 Lua 协同程序(Coroutine)与线程类似:拥有独立的堆栈、局部变量、指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。 协同程序可以理解为一种特殊的线程,可以暂停和恢复其执行,从而允…...

【vue+帆软】帆软升级,从版本9升级到版本11,记录升级过程

帆软要升级,记录下过程 1、帆软官网地址必不可少,戳这里,跳转帆软官网 点击前端开发指南 点击JS API 跳转过来就是版本11 一直往下翻,在最底部有个2.2 在Web中使用,圈起来的就是要引入到index.html中的脚本 在项…...

linux从0到1 基础完整知识

1. Linux系统概述 Linux是一种开源操作系统,与Windows或macOS等操作系统不同,Linux允许用户自由地查看、修改和分发其源代码。以下是Linux系统的一些显著的优势。 稳定性和可靠性: 内核以其稳定性而闻名,能够持续运行数月甚至数…...

“人大金仓”正式更名为“电科金仓”; TDSQL-C支持回收站/并行DDL等功能; BigQuery支持直接查询AlloyDB

重要更新 1. “人大金仓”正式更名为“电科金仓”,完整名称“中电科金仓(北京)科技股份有限公司”,突出金仓是中国电子科技集团有限公司在基础软件领域产品( [1] ) 。据悉人大金仓在上半年营收入为9056万元,净利润约21…...

大模型微调 - 用PEFT来配置和应用 LoRA 微调

大模型微调 - 用PEFT来配置和应用 LoRA 微调 flyfish PEFT(Parameter-Efficient Fine-Tuning)是一种参数高效微调库,旨在减少微调大型预训练模型时需要更新的参数量,而不影响最终模型的性能。它支持几种不同的微调方法&#xff…...

Ubuntu构建只读文件系统

本文介绍Ubuntu构建只读文件系统。 嵌入式系统使用过程中,有时会涉及到非法关机(比如直接关机,或意外断电),这可能造成文件系统损坏,为了提高系统的可靠性,通常将根文件系统设置为只读&#xf…...

【黑金系】金融UI/UX体验设计师面试作品集 Figma源文件分享

在数字金融时代,UI/UX体验设计师扮演着至关重要的角色。他们不仅塑造着产品的界面,更引领着用户的使用体验。我们的面试作品集,正是这样一部展现金融UI/UX设计魅力的宝典。 这套作品集汇聚了众多经典案例,每一处设计都经过精心雕…...

Golang | Leetcode Golang题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; func isSubsequence(s string, t string) bool {n, m : len(s), len(t)f : make([][26]int, m 1)for i : 0; i < 26; i {f[m][i] m}for i : m - 1; i > 0; i-- {for j : 0; j < 26; j {if t[i] byte(j a) {f[i][j] i} else {…...

Liunx常用指令

1. 文件和目录管理 ls 用法&#xff1a;ls [选项] [文件/目录]示例&#xff1a;ls -l&#xff08;以长列表格式显示&#xff09;&#xff0c;ls -a&#xff08;显示所有文件&#xff0c;包括隐藏文件&#xff09;。 cd 用法&#xff1a;cd [目录]示例&#xff1a;cd ..&#xf…...

CSS基础:浮动(float)如何使用清楚以及代替方法

浮动元素在 CSS 中主要通过 float 属性来控制&#xff0c;影响元素的排列方式。浮动用于创建流式布局&#xff0c;常用于实现图文混排、布局列等效果。以下是浮动元素的相关属性和使用方法&#xff1a; 1. 基本浮动属性 float: 控制元素的浮动方向&#xff0c;可以设置为 left…...

margin重叠该怎么解决?

在CSS中&#xff0c;当两个或多个垂直相邻的块级元素&#xff08;如<div>&#xff09;的margin相遇时&#xff0c;它们不会叠加成两个margin的和&#xff0c;而是会取两个margin中的较大值&#xff0c;这种现象被称为“margin重叠”&#xff08;margin collapsing&#x…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...