Flask-SQLAlchemy 操作 SQLite 数据库示例

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仅用于开发环境,生产环境必须关闭(避免安全风险)。

运行前的准备与注意事项

  1. 安装依赖

    先执行以下命令安装需要的库:

    pip install flask flask-sqlalchemy

  2. 模板文件(可选)

    代码中用了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>
  1. 数据库文件

    运行后会自动生成test.db(SQLite 数据库文件),可以用工具(如 DB Browser for SQLite)打开查看表结构和数据。

  2. 重复运行的效果

    第一次运行会创建test_user并设置邮箱为test@example.com,然后更新为updated_test@example.com。后续运行时,因为test_user已存在,不会重复新增,只会显示当前数据。

总结

这段代码非常适合初学者入门,清晰展示了 Flask-SQLAlchemy 的核心用法:从配置数据库、定义模型,到通过会话(db.session)实现增删改查。如果想进一步学习,可以尝试:

  • 扩展模型字段(如添加agegender等)。

  • 实现更复杂的查询(如按条件筛选、排序、分页)。

  • 处理表单提交,动态添加用户(结合request库)。

  • 改用 MySQL/PostgreSQL 数据库(只需修改SQLALCHEMY_DATABASE_URI)。

相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花6 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸6 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain6 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神7 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员7 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java7 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿7 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴7 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存