Flask 数据库操作

以下是关于 Flask 数据库操作的中文讲解,结合 Visual Studio Code(VSCode)环境,基于 Python 和 Flask 创建的项目,内容简洁清晰,适合初学者。讲解包括 Flask 数据库操作的基本概念、使用 SQLAlchemy 进行数据库操作、中文支持、在 VSCode 中的实践以及调试方法。本讲解将生成 Flask 应用和相关代码示例,遵循您提供的 artifact 格式要求,并避免重复之前关于 Flask 路由、视图函数、模板渲染和表单处理的内容,聚焦于数据库操作。

1. 什么是 Flask 数据库操作?

Flask 数据库操作是指在 Flask 应用中使用数据库存储和查询数据,以支持动态 Web 应用。Flask 本身不提供数据库功能,但通过扩展(如 Flask-SQLAlchemy)可以方便地集成关系型数据库(如 SQLite、MySQL、PostgreSQL)。

  • 特点
  • 使用 Flask-SQLAlchemy 扩展简化数据库操作。
  • 支持 CRUD 操作(创建、读取、更新、删除)。
  • 支持中文数据存储和查询。
  • 结合 Jinja2 模板展示数据库查询结果。
  • 使用场景
  • 存储用户信息(如中文姓名、邮箱)。
  • 查询动态数据(如文章列表)。
  • 处理表单数据并保存到数据库。

2. 准备工作

确保 Flask 项目环境

  1. 安装 Python:确保安装 Python 3.8+(访问 python.org)。
  2. 创建虚拟环境
   python -m venv venv
   source venv/bin/activate  # Linux/Mac
   venv\Scripts\activate     # Windows
  1. 安装 Flask 和 Flask-SQLAlchemy
   pip install flask flask-sqlalchemy
  1. 创建项目结构
   my-flask-app/
   ├── app.py
   ├── templates/
   │   ├── index.html
   │   └── users.html
   └── database.db  # SQLite 数据库文件

VSCode 配置

  • 安装扩展
  • Python:提供 Python 代码支持。
  • Pylance:增强代码补全和类型检查。
  • Jinja:支持 Jinja2 模板高亮和补全。
  • SQLite:用于查看和编辑 SQLite 数据库。
  • 配置 Python 环境
  • 选择虚拟环境的 Python 解释器(Ctrl+Shift+P → “Python: Select Interpreter”)。
  • 创建 .vscode/settings.json
    json { "python.pythonPath": "venv/bin/python", // Linux/Mac // "python.pythonPath": "venv\\Scripts\\python.exe", // Windows "python.linting.enabled": true, "python.linting.pylintEnabled": true, "[html]": { "editor.defaultFormatter": "HookyQR.beautify" } }
  • 中文支持
  • 确保 Python 和 HTML 文件保存为 UTF-8 编码。
  • 配置 VSCode 终端支持中文:
    json { "terminal.integrated.env.osx": { "LANG": "zh_CN.UTF-8" } }

3. Flask 数据库操作基本使用

使用 Flask-SQLAlchemy 集成 SQLite 数据库,展示基本的 CRUD 操作(创建、读取、更新、删除)。

示例代码:用户管理

  1. 创建 app.py

    from flask import Flask, render_template, request
    from flask_sqlalchemy import SQLAlchemy

app = Flask(name)
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///database.db’
app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = False
db = SQLAlchemy(app)

定义 User 模型

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)

def __repr__(self):
    return f'<User {self.name}>'

创建数据库表

with app.app_context():
db.create_all()

@app.route(‘/’, methods=[‘GET’, ‘POST’])
def home():
if request.method == ‘POST’:
name = request.form.get(‘name’)
email = request.form.get(’email’)
if name and email:
try:
user = User(name=name, email=email)
db.session.add(user)
db.session.commit()
return render_template(‘index.html’, message=’用户添加成功!’)
except:
db.session.rollback()
return render_template(‘index.html’, error=’邮箱已存在!’)
return render_template(‘index.html’, error=’姓名和邮箱不能为空!’)
return render_template(‘index.html’, message=None, error=None)

@app.route(‘/users’)
def users():
users = User.query.all()
return render_template(‘users.html’, users=users)

if name == ‘main‘:
app.run(debug=True)

  1. 创建 templates/index.html



    添加用户
    添加用户 {% if message %}
    {{ message }}
    {% endif %}
    {% if error %}
    {{ error }}
    {% endif %} 姓名:
    邮箱:
    添加 查看用户列表


  2. 创建 templates/users.html



    用户列表
    用户列表 {% if users %}
    • 姓名:{{ user.name }},邮箱:{{ user.email }}

    {% else %}
    暂无用户
    {% endif %}
    返回


代码说明

  • app.py
  • 配置 SQLite 数据库:app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
  • 定义 User 模型:包含 idnameemail 字段,支持中文姓名。
  • home():处理表单提交,添加用户到数据库,捕获邮箱重复错误。
  • users():查询所有用户并渲染。
  • 使用 db.session 管理数据库事务(addcommitrollback)。
  • index.html
  • 显示表单,支持中文输入。
  • 显示成功或错误提示(如“用户添加成功!”)。
  • users.html
  • 使用 Jinja2 循环显示用户列表。
  • 支持中文姓名和邮箱。
  • 运行
  • 保存文件,运行 python app.py
  • 访问 http://127.0.0.1:5000/,输入中文姓名(如“张三”)和邮箱,提交后查看 /users 页面显示用户列表。

4. 进阶数据库操作:更新与删除

添加更新和删除功能,扩展用户管理。

示例代码:更新与删除

  1. 修改 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:///database.db’
app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = False
db = SQLAlchemy(app)

定义 User 模型

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)

def __repr__(self):
    return f'<User {self.name}>'

创建数据库表

with app.app_context():
db.create_all()

@app.route(‘/’, methods=[‘GET’, ‘POST’])
def home():
if request.method == ‘POST’:
name = request.form.get(‘name’)
email = request.form.get(’email’)
if name and email:
try:
user = User(name=name, email=email)
db.session.add(user)
db.session.commit()
return render_template(‘index.html’, message=’用户添加成功!’)
except:
db.session.rollback()
return render_template(‘index.html’, error=’邮箱已存在!’)
return render_template(‘index.html’, error=’姓名和邮箱不能为空!’)
return render_template(‘index.html’, message=None, error=None)

@app.route(‘/users’)
def users():
users = User.query.all()
return render_template(‘users.html’, users=users)

@app.route(‘/update/’, methods=[‘GET’, ‘POST’])
def update(id):
user = User.query.get_or_404(id)
if request.method == ‘POST’:
name = request.form.get(‘name’)
email = request.form.get(’email’)
if name and email:
try:
user.name = name
user.email = email
db.session.commit()
return redirect(url_for(‘users’))
except:
db.session.rollback()
return render_template(‘update.html’, user=user, error=’邮箱已存在!’)
return render_template(‘update.html’, user=user, error=’姓名和邮箱不能为空!’)
return render_template(‘update.html’, user=user, error=None)

@app.route(‘/delete/’)
def delete(id):
user = User.query.get_or_404(id)
db.session.delete(user)
db.session.commit()
return redirect(url_for(‘users’))

if name == ‘main‘:
app.run(debug=True)

  1. 创建 templates/update.html



    更新用户
    更新用户 {% if error %}
    {{ error }}
    {% endif %} 姓名:
    邮箱:
    更新 返回


  2. 修改 templates/users.html



    用户列表
    用户列表 {% if users %}
    • 姓名:{{ user.name }},邮箱:{{ user.email }} 编辑 删除

    {% else %}
    暂无用户
    {% endif %}
    返回


代码说明

  • app.py
  • update(id):查询用户,处理更新表单,验证邮箱唯一性。
  • delete(id):删除指定用户并重定向到用户列表。
  • 使用 url_for() 生成动态 URL。
  • update.html
  • 显示用户当前信息,支持中文编辑。
  • 提交后更新数据库。
  • users.html
  • 添加“编辑”和“删除”链接,支持中文确认提示。
  • 运行
  • 保存文件,运行 python app.py
  • 访问 http://127.0.0.1:5000/ 添加用户,http://127.0.0.1:5000/users 查看列表,点击“编辑”或“删除”操作。

5. 数据库操作注意事项

  • 数据库配置
  • 使用 app.config['SQLALCHEMY_DATABASE_URI'] 指定数据库(如 SQLite、MySQL)。
  • 设置 SQLALCHEMY_TRACK_MODIFICATIONS = False 避免警告。
  • 事务管理
  • 使用 db.session.commit() 保存更改。
  • 使用 db.session.rollback() 处理错误。
  • 中文支持
  • 数据库字段支持 UTF-8 编码,SQLite 默认支持。
  • 确保模板包含 <meta charset="UTF-8">
  • 错误处理
  • 捕获数据库异常(如重复邮箱)。
  • 返回中文错误提示提升用户体验.
  • 性能
  • 避免频繁查询数据库,考虑分页或缓存。

6. 调试数据库操作

  1. Flask 调试模式
  • 启用 app.run(debug=True),浏览器显示数据库错误。
  • 终端输出 SQLAlchemy 查询日志。
  1. SQLite 扩展
  • 使用 VSCode 的 SQLite 扩展查看 database.db 内容。
  1. Chrome 开发者工具
  • F12,检查“网络”选项卡,确认表单提交和响应。
  1. VSCode 调试
  • 配置 .vscode/launch.json
    json { "version": "0.2.0", "configurations": [ { "name": "Flask Debug", "type": "python", "request": "launch", "program": "${workspaceFolder}/app.py", "args": [], "env": { "FLASK_ENV": "development" } } ] }
  • F5 调试,设置断点检查 db.session 和查询结果。

7. 中文支持

  • Python 文件:确保 app.py 保存为 UTF-8。
  • 模板文件:HTML 文件包含 <meta charset="UTF-8">
  • 数据库:SQLite 支持中文存储,字段值直接保存中文(如“张三”)。
  • VSCode 配置
  • 终端支持中文:
    json { "terminal.integrated.env.osx": { "LANG": "zh_CN.UTF-8" } }

8. 常见问题

  • 数据库未创建
  • 确保 db.create_all()app_context() 中调用。
  • 检查数据库 URI 是否正确。
  • 中文乱码
  • 确认 HTML 文件包含 <meta charset="UTF-8">
  • 检查 Python 文件和数据库编码为 UTF-8。
  • 查询返回空
  • 确认数据库中有数据。
  • 检查查询条件(如 User.query.get_or_404(id))。
  • 项目无法运行
  • 确保 Flask 和 Flask-SQLAlchemy 已安装:
    bash pip install flask flask-sqlalchemy
  • 检查虚拟环境是否激活。

9. 获取途径

如需更复杂的数据库操作示例(如分页、关联表)或进一步指导,请提供具体需求!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注