使用 Flask 实现多个 MySQL 数据库连接的项目

在 Web 开发中,选择合适的数据库类型和架构是一个重要的任务。Flask 是一个灵活的 Web 框架,可以与多种数据库一起使用,包括尽可能多的 MySQL 数据库。本文将介绍如何在 Flask 中使用多个 MySQL 数据库,提供具体的代码示例,并包含状态图和关系图,帮助你更好地理解各个部分的工作原理。

1. 项目背景

为什么要在 Flask 项目中使用多个 MySQL 数据库?有几个理由,例如:

  • 数据隔离:不同的模块可能需要不同的数据库来存储信息,例如用户信息和订单信息可以分开存储。
  • 管理负载:将不同的数据存储到不同的数据库可以降低单一数据库的负载。
  • 多租户应用:对于需要支持多个租户的应用,可能需要为每个租户分配不同的数据库。

2. 环境准备

为了开始这个项目,你需要安装一些必要的库:

pip install Flask Flask-SQLAlchemy pymysql

确保你有 MySQL 数据库的访问权限,并事先创建了两个数据库,例如 db1db2

3. Flask 项目结构

我们将创建一个简单的 Flask 应用,其中包括对 db1db2 的访问。

/flask_multidb
|-- app.py
|-- models.py

3.1 数据库配置与连接

app.py 中配置多个数据库:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 数据库配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://user:password@localhost/db1'
app.config['SQLALCHEMY_BINDS'] = {
    'db2': 'mysql+pymysql://user:password@localhost/db2'
}
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

3.2 创建模型

models.py 中定义两个数据库的模型。

from app import db

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

class Order(db.Model):
    __bind_key__ = 'db2'  # 指定使用db2数据库
    __tablename__ = 'orders'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    item = db.Column(db.String(100))

这样,我们在 db1 中有 User 模型,在 db2 中有 Order 模型。

4. 数据库操作示例

接下来,我们将创建一些基本的 API 来操作这两个数据库。

4.1 添加用户

app.py 中添加一个 API 接口,用于添加用户。

from flask import request, jsonify
from models import User, Order

@app.route('/add_user', methods=['POST'])
def add_user():
    name = request.json.get('name')
    new_user = User(name=name)
    db.session.add(new_user)
    db.session.commit()
    return jsonify({"message": "User added!"}), 201

4.2 添加订单

同样,我们也可以添加一个 API 接口用于添加订单。

@app.route('/add_order', methods=['POST'])
def add_order():
    user_id = request.json.get('user_id')
    item = request.json.get('item')
    new_order = Order(user_id=user_id, item=item)
    db.session.add(new_order)
    db.session.commit()
    return jsonify({"message": "Order added!"}), 201

5. 状态图

下面是一个简单的状态图,展示了用户操作的状态变化:

stateDiagram-v2
    [*] --> Start
    Start --> AddUser
    AddUser --> UserAdded
    UserAdded --> AddOrder
    AddOrder --> OrderAdded
    OrderAdded --> [*]

6. 关系图

我们将创建一个简单的 E-R 关系图,展示 UserOrder 模型之间的关系:

erDiagram
    USERS {
        int id PK
        string name
    }
    ORDERS {
        int id PK
        int user_id FK
        string item
    }
    USERS ||--o{ ORDERS : has

7. 运行 Flask 应用

在终端中运行你的 Flask 应用:

python app.py

接着可以通过 Postman 或 Curl 发起请求:

curl -X POST  -H "Content-Type: application/json" -d '{"name": "Alice"}'

然后添加订单:

curl -X POST  -H "Content-Type: application/json" -d '{"user_id": 1, "item": "Book"}'

8. 总结

通过以上的示例,我们展示了如何在 Flask 应用中同时连接多个 MySQL 数据库。使用 SQLAlchemy 允许你轻松地管理与多个数据库的连接,而 API 的构建进一步增强了应用的可用性和扩展性。希望本文能够帮助你理解如何在 Flask 应用中有效地处理多数据库环境。如果你有任何问题,或者有关于此主题的反馈,欢迎在评论区讨论!