目录

  1. 数据库在 Flask 中的作用
  2. 使用 Flask-SQLAlchemy
  3. 基本 CRUD 操作
  4. 数据库迁移
  5. 参考资料

数据库在 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)

迁移命令

  1. 初始化迁移:
   flask db init
  1. 生成迁移文件:
   flask db migrate -m "Initial migration"
  1. 应用迁移:
   flask db upgrade
  • 解释:迁移工具跟踪模型变化并更新数据库结构。

参考资料


这些内容涵盖了 Flask 数据库操作的基础和进阶用法。如果需要特定数据库(如 PostgreSQL)或更复杂查询的示例,请告诉我!