目录
数据库在 Flask 中的作用
在 Flask 应用中,数据库用于存储和管理动态数据(如用户信息、文章等)。Flask 本身不提供数据库支持,但通过扩展(如 Flask-SQLAlchemy)可以轻松集成关系型数据库(如 SQLite、PostgreSQL、MySQL 等)。
使用 Flask-SQLAlchemy
Flask-SQLAlchemy 是 Flask 的流行扩展,简化了 SQLAlchemy(一个强大的 ORM 工具)与 Flask 的集成。
安装
pip install flask-sqlalchemy
示例:初始化和定义模型
项目结构
my_app/
├── app.py
└── templates/
└── index.html
app.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 配置数据库(使用 SQLite 作为示例)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化数据库
db = SQLAlchemy(app)
# 定义模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
@app.route('/')
def home():
return render_template('index.html')
if __name__ == '__main__':
with app.app_context():
db.create_all() # 创建数据库和表
app.run(debug=True)
- 解释:
SQLALCHEMY_DATABASE_URI
:指定数据库连接(如 SQLite 的site.db
)。db = SQLAlchemy(app)
:初始化数据库。User
:定义一个模型,表示数据库中的表。db.create_all()
:创建表(需在应用上下文中运行)。
基本 CRUD 操作
CRUD 表示创建(Create)、读取(Read)、更新(Update)和删除(Delete)。以下是使用 Flask-SQLAlchemy 的示例。
示例:完整的 CRUD 操作
app.py
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
username = request.form['username']
email = request.form['email']
user = User(username=username, email=email)
db.session.add(user) # 创建
db.session.commit()
return redirect(url_for('home'))
users = User.query.all() # 读取
return render_template('index.html', users=users)
@app.route('/update/<int:id>', methods=['POST'])
def update(id):
user = User.query.get_or_404(id)
user.username = request.form['username']
user.email = request.form['email']
db.session.commit() # 更新
return redirect(url_for('home'))
@app.route('/delete/<int:id>')
def delete(id):
user = User.query.get_or_404(id)
db.session.delete(user) # 删除
db.session.commit()
return redirect(url_for('home'))
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
templates/index.html
<!DOCTYPE html>
<html>
<head>
<title>用户管理</title>
</head>
<body>
<h1>添加用户</h1>
<form method="POST">
<input type="text" name="username" placeholder="用户名" required>
<input type="email" name="email" placeholder="邮箱" required>
<input type="submit" value="添加">
</form>
<h1>用户列表</h1>
<ul>
{% for user in users %}
<li>
{{ user.username }} - {{ user.email }}
<form method="POST" action="/update/{{ user.id }}" style="display:inline;">
<input type="text" name="username" value="{{ user.username }}">
<input type="email" name="email" value="{{ user.email }}">
<input type="submit" value="更新">
</form>
<a href="/delete/{{ user.id }}">删除</a>
</li>
{% endfor %}
</ul>
</body>
</html>
</xaiArtifact>
- **解释**:
- **创建**:`db.session.add()` 和 `db.session.commit()` 添加新用户。
- **读取**:`User.query.all()` 获取所有用户。
- **更新**:修改对象属性后提交。
- **删除**:`db.session.delete()` 删除用户。
---
### 数据库迁移
对于生产环境,数据库结构可能需要随代码更新而变化。Flask-Migrate(基于 Alembic)提供了迁移功能。
#### 安装
bash
pip install flask-migrate
#### 示例
**`app.py`**
python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(name)
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///site.db’
app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
if name == ‘main‘:
app.run(debug=True)
迁移命令
- 初始化迁移:
flask db init
- 生成迁移文件:
flask db migrate -m "Initial migration"
- 应用迁移:
flask db upgrade
- 解释:迁移工具跟踪模型变化并更新数据库结构。
参考资料
- Flask-SQLAlchemy 官方文档 – 数据库集成指南。
- Flask-Migrate 官方文档 – 数据库迁移教程。
- SQLAlchemy 官方文档 – 深入了解 ORM。
- Real Python – Flask 数据库 – 数据库实践教程。
这些内容涵盖了 Flask 数据库操作的基础和进阶用法。如果需要特定数据库(如 PostgreSQL)或更复杂查询的示例,请告诉我!
发表回复