Flask-SQLAlchemy 操作 SQLite 数据库示例
这段代码是一个非常完整的 Flask + Flask-SQLAlchemy 操作 SQLite 数据库的示例,涵盖了从初始化配置到基本 CRUD(增删改查)的全流程。下面我会逐部分解析代码的作用和关键点,帮助你更好地理解它的工作原理。
一、核心库导入与应用初始化
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = 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() # 提交删除(生效)
# 渲染模板或返回HTML
return 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 默认的模板目录)。 -
在
<!DOCTYPE html> <html> <body>templates中创建sqltest.html,示例内容:</body> </html><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 %}
-
数据库文件:
运行后会自动生成
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)。