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 项目环境
- 安装 Python:确保安装 Python 3.8+(访问 python.org)。
- 创建虚拟环境:
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
- 安装 Flask 和 Flask-SQLAlchemy:
pip install flask flask-sqlalchemy
- 创建项目结构:
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 操作(创建、读取、更新、删除)。
示例代码:用户管理
- 创建
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)
- 创建
templates/index.html
:
添加用户
添加用户 {% if message %}
{{ message }}
{% endif %}
{% if error %}
{{ error }}
{% endif %} 姓名:
邮箱:
添加 查看用户列表 - 创建
templates/users.html
:
用户列表
用户列表 {% if users %}- 姓名:{{ user.name }},邮箱:{{ user.email }}
{% else %}
暂无用户
{% endif %}
返回
代码说明
- app.py:
- 配置 SQLite 数据库:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
。 - 定义
User
模型:包含id
、name
和email
字段,支持中文姓名。 home()
:处理表单提交,添加用户到数据库,捕获邮箱重复错误。users()
:查询所有用户并渲染。- 使用
db.session
管理数据库事务(add
、commit
、rollback
)。 - index.html:
- 显示表单,支持中文输入。
- 显示成功或错误提示(如“用户添加成功!”)。
- users.html:
- 使用 Jinja2 循环显示用户列表。
- 支持中文姓名和邮箱。
- 运行:
- 保存文件,运行
python app.py
。 - 访问
http://127.0.0.1:5000/
,输入中文姓名(如“张三”)和邮箱,提交后查看/users
页面显示用户列表。
4. 进阶数据库操作:更新与删除
添加更新和删除功能,扩展用户管理。
示例代码:更新与删除
- 修改
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)
- 创建
templates/update.html
:
更新用户
更新用户 {% if error %}
{{ error }}
{% endif %} 姓名:
邮箱:
更新 返回 - 修改
templates/users.html
:
用户列表
用户列表 {% if users %}
{% 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. 调试数据库操作
- Flask 调试模式:
- 启用
app.run(debug=True)
,浏览器显示数据库错误。 - 终端输出 SQLAlchemy 查询日志。
- SQLite 扩展:
- 使用 VSCode 的 SQLite 扩展查看
database.db
内容。
- Chrome 开发者工具:
- 按
F12
,检查“网络”选项卡,确认表单提交和响应。
- 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. 获取途径
- Flask:通过 pip 免费安装,访问 flask.palletsprojects.com.
- Flask-SQLAlchemy:通过 pip 安装,访问 flask-sqlalchemy.palletsprojects.com.
- Python:免费下载,访问 python.org.
- VSCode:可通过 grok.com、x.com、VSCode iOS/Android 应用免费使用(有限额)。付费订阅(如 SuperGrok)提供更高配额,详情见 x.ai/grok.
如需更复杂的数据库操作示例(如分页、关联表)或进一步指导,请提供具体需求!