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)。

相关推荐
老华带你飞8 小时前
房屋租赁|房屋出租|房屋租赁系统|基于Springboot的房屋租赁系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·vue·论文·毕设·房屋租赁系统
TDengine (老段)8 小时前
TDengine 数学函数 ASCII 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
sukida1008 小时前
在openSUSE-Leap-15.6-DVD-x86_64-Media自制应用软件离线包——备份91个视频解码器的rpm包
数据库·redis·音视频
信仰_2739932438 小时前
Mysql中MVCC的流程
数据库·mysql
123461619 小时前
互联网大厂Java面试:从Spring Boot到微服务的探索
java·数据库·spring boot·微服务·面试·mybatis·orm
一 乐9 小时前
农产品销售系统|农产品电商|基于SprinBoot+vue的农产品销售系统(源码+数据库+文档)
java·javascript·数据库·vue.js·spring boot·后端·农产品销售系统
攀小黑9 小时前
docker 容器内nacos(若依plus打包)连接另一台内网服务器显示数据库连接失败
服务器·数据库·docker
七月稻草人9 小时前
Rust 与数据库连接池的集成:安全与性能的深度耦合
数据库·安全·rust
Andy9 小时前
Mysql基础2
android·数据库·mysql