Flask-SQLAlchemy 操作 SQLite 数据库示例
Flask-SQLAlchemy 操作 SQLite 数据库示例
这段代码是一个非常完整的 Flask + Flask-SQLAlchemy 操作 SQLite 数据库的示例,涵盖了从初始化配置到基本 CRUD(增删改查)的全流程。下面我会逐部分解析代码的作用和关键点,帮助你更好地理解它的工作原理。
一、核心库导入与应用初始化
from flask import Flask, render_templatefrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__) # 初始化Flask应用,__name__表示当前模块名,用于定位资源
-
Flask:核心框架,用于创建 Web 应用。 -
render_template:用于渲染 HTML 模板(代码中注释了直接返回 HTML 字符串的方式,也可以用模板)。 -
SQLAlchemy:Flask 的数据库扩展,封装了 SQLAlchemy 的核心功能,简化数据库操作。
二、数据库配置
# 配置SQLite数据库:指定数据库文件为test.db(会自动生成在项目目录)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'# 关闭“修改追踪”功能(减少内存占用,推荐添加)app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 关联数据库与Flask应用db = SQLAlchemy(app)
-
SQLALCHEMY_DATABASE_URI:指定数据库连接地址,这里用 SQLite(文件型数据库),test.db会自动生成在项目根目录。 -
SQLALCHEMY_TRACK_MODIFICATIONS:关闭后减少性能开销,几乎所有场景都建议设为False。 -
db = SQLAlchemy(app):创建数据库操作对象db,后续的模型定义、CRUD 都通过它实现。
三、定义数据模型(映射数据库表)
class User(db.Model):# 1. 主键ID:自增整数,每个用户唯一id = db.Column(db.Integer, primary_key=True)# 2. 用户名:最多80字符,唯一(不重复),不能为空username = db.Column(db.String(80), unique=True, nullable=False)# 3. 邮箱:最多120字符,唯一,不能为空email = db.Column(db.String(120), unique=True, nullable=False)# 打印对象时的格式(方便调试)def __repr__(self):return f'<User {self.username}>'
-
User类继承db.Model(Flask-SQLAlchemy 的模型基类),对应数据库中的users表(默认表名为类名小写)。 -
每个属性通过
db.Column定义为表的字段:-
id:主键(primary_key=True),自增整数(db.Integer)。 -
username:字符串类型(db.String(80)),唯一(unique=True),非空(nullable=False)。 -
email:同username,但长度限制为 120 字符。
-
-
__repr__:自定义对象的打印格式,调试时print(user)会显示<User 用户名>,更直观。
四、创建数据库表
with app.app_context():# 创建所有定义好的模型对应的表(表已存在则不重复创建)db.create_all()
-
关键:在 Flask 2.0 + 中,操作数据库(包括创建表)需要在应用上下文中执行,
with app.app_context()用于激活上下文。 -
db.create_all():根据模型类自动生成数据库表(如果表不存在)。运行后,项目目录会生成test.db文件。
五、路由与 CRUD 操作(核心逻辑)
@app.route('/') # 定义根路由,访问http://localhost:5000时执行index函数def index():# 1. 新增数据(Create):添加测试用户(避免重复)if not User.query.filter_by(username='test_user').first(): # 先查是否存在new_user = User(username='test_user', email='test@example.com') # 创建对象db.session.add(new_user) # 加入会话(临时存储)db.session.commit() # 提交会话(真正写入数据库)# 2. 查询数据(Read)all_users = User.query.all() # 查所有用户target_user = User.query.filter_by(username='test_user').first() # 按用户名查第一个# 3. 更新数据(Update):修改邮箱if target_user:target_user.email = 'updated_test@example.com' # 直接修改属性db.session.commit() # 提交修改(生效)# 4. 删除数据(Delete):暂时注释,避免误删# if target_user:# db.session.delete(target_user) # 标记删除# db.session.commit() # 提交删除(生效)# 渲染模板或返回HTMLreturn render_template('sqltest.html', all_users=all_users, target_user=target_user)# 也可以直接返回字符串(注释中的方式)
这部分是核心,实现了完整的 CRUD 操作:
1. 新增(Create)
-
先通过
User.query.filter_by(username='test_user').first()检查用户是否存在,避免重复添加。 -
新建
User对象,用db.session.add()加入会话,最后db.session.commit()提交到数据库(必须 commit 才会真正写入)。
2. 查询(Read)
-
User.query.all():查询所有用户,返回列表。 -
User.query.filter_by(username='test_user').first():按条件查询(用户名 = test_user),返回第一个结果(无结果则为None)。
3. 更新(Update)
-
先查询到目标对象(
target_user),直接修改其属性(target_user.email = ...)。 -
调用
db.session.commit()提交修改(无需add,因为对象已在会话中)。
4. 删除(Delete)
-
先查询到目标对象,用
db.session.delete(target_user)标记删除。 -
调用
db.session.commit()提交删除(真正从数据库中移除)。
六、运行应用
if __name__ == '__main__':app.run(debug=True) # 启动服务器,debug=True表示开发模式(自动重启、显示错误)
-
运行脚本后,服务器会启动在
http://localhost:5000。 -
debug=True仅用于开发环境,生产环境必须关闭(避免安全风险)。
运行前的准备与注意事项
-
安装依赖:
先执行以下命令安装需要的库:
pip install flask flask-sqlalchemy
-
模板文件(可选):
代码中用了
render_template('sqltest.html'),如果需要使用模板:如果不想用模板,可以直接使用代码中注释的
return f'''...'''方式返回 HTML 字符串。
-
在项目根目录创建
templates文件夹(Flask 默认的模板目录)。 -
在
templates中创建sqltest.html,示例内容:
<!DOCTYPE html><html><body><h3>所有用户:</h3><ul>{% for user in all_users %}<li>{{ user.username }} - {{ user.email }}</li>{% endfor %}</ul><h3>目标用户:</h3>{% if target_user %}<p>用户名:{{ target_user.username }}</p><p>邮箱:{{ target_user.email }}</p>{% else %}<p>用户不存在</p>{% endif %}</body></html>
-
数据库文件:
运行后会自动生成
test.db(SQLite 数据库文件),可以用工具(如 DB Browser for SQLite)打开查看表结构和数据。 -
重复运行的效果:
第一次运行会创建
test_user并设置邮箱为test@example.com,然后更新为updated_test@example.com。后续运行时,因为test_user已存在,不会重复新增,只会显示当前数据。
总结
这段代码非常适合初学者入门,清晰展示了 Flask-SQLAlchemy 的核心用法:从配置数据库、定义模型,到通过会话(db.session)实现增删改查。如果想进一步学习,可以尝试:
-
扩展模型字段(如添加
age、gender等)。 -
实现更复杂的查询(如按条件筛选、排序、分页)。
-
处理表单提交,动态添加用户(结合
request库)。 -
改用 MySQL/PostgreSQL 数据库(只需修改
SQLALCHEMY_DATABASE_URI)。
