使用 Flask 实现多个 MySQL 数据库连接的项目
在 Web 开发中,选择合适的数据库类型和架构是一个重要的任务。Flask 是一个灵活的 Web 框架,可以与多种数据库一起使用,包括尽可能多的 MySQL 数据库。本文将介绍如何在 Flask 中使用多个 MySQL 数据库,提供具体的代码示例,并包含状态图和关系图,帮助你更好地理解各个部分的工作原理。
1. 项目背景
为什么要在 Flask 项目中使用多个 MySQL 数据库?有几个理由,例如:
- 数据隔离:不同的模块可能需要不同的数据库来存储信息,例如用户信息和订单信息可以分开存储。
- 管理负载:将不同的数据存储到不同的数据库可以降低单一数据库的负载。
- 多租户应用:对于需要支持多个租户的应用,可能需要为每个租户分配不同的数据库。
2. 环境准备
为了开始这个项目,你需要安装一些必要的库:
pip install Flask Flask-SQLAlchemy pymysql
确保你有 MySQL 数据库的访问权限,并事先创建了两个数据库,例如 db1
和 db2
。
3. Flask 项目结构
我们将创建一个简单的 Flask 应用,其中包括对 db1
和 db2
的访问。
/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 关系图,展示 User
和 Order
模型之间的关系:
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 应用中有效地处理多数据库环境。如果你有任何问题,或者有关于此主题的反馈,欢迎在评论区讨论!