在使用 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.py
import os
class Config:
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_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 Migrate
db = 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 uuid4
class BaseModel(db.Model):
__abstract__ = True
id = 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 本地开发中的数据库迁移
在本地开发中,你可以通过以下步骤进行数据库迁移:
-
生成迁移文件: 在本地开发时,当你修改模型时,运行以下命令生成迁移文件:
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 App
on:
push:
branches:
- master
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v2
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Build the Docker image
run: docker build . -t ${{ secrets.DOCKER_HUB_USERNAME }}/flask_app:${{ github.sha }}
- name: Push the Docker image
run: docker push ${{ secrets.DOCKER_HUB_USERNAME }}/flask_app:${{ github.sha }}
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
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 || true
docker 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 migrate
和flask db upgrade
来管理数据库的变化。 -
生产环境: 在生产环境中,你不需要再生成迁移文件,而是使用已经在开发环境中生成的迁移文件,并通过
flask db upgrade
来更新数据库结构。GitHub Actions 可以帮助你在部署时自动执行这一过程。
通过合理的开发流程和生产部署策略,你可以确保 Flask 应用中的数据库始终与模型同步,并且在不同的环境中保持一致。
这样,你就可以轻松地管理 Flask 项目中的数据库,无论是在本地开发,还是在远程生产环境中。