Flask知识点串烧(五)--- Flask-SQLAlchemy

本文详细介绍了使用Flask-SQLAlchemy进行数据库操作的相关知识,包括数据库概述、ORM的优势、数据库连接、模型定义、数据库操作、事务管理、关系定义、数据库迁移、级联操作和事件监听等。通过实例展示了如何在Flask应用中灵活地管理和操作数据库,以及如何利用Flask-Migrate进行数据库版本控制。
摘要由CSDN通过智能技术生成

概述

  • 数据库是指由存储数据的多个或多个文件组成的集合,是一种容器;管理数据库的软件被称为DBMS;
  • 数据库的分类:
    • SQL 关系型数据库使用关系来定义数据对象,不同表之间使用关系连接。
    • NoSQL 泛指不使用关系型数据库中的表格形式的数据库。NoSQL数据库被大量应用于实时WEB程序和大型程序中。与传统SQL相比,在速度和可扩展性方面有很大优势。最常用的2种NoSQL数据库:
    • 文档存储:文档存储使用的文档类似SQL数据库中的记录,文档使用类JSON格式来表示数据,如MongoDB;
    • 键值对存储:通过键来存取数据,在读取上非常快,通常用来存储临时内容,作为缓存使用。常见的键值对DBMS如Redis,不仅可以管理键值对数据库,还可以作为缓存后端和消息代理。
  • 如何选择数据库?

        - NoSQL数据库不需要定义表和列等结构,也不限定存储的数据格式,在存储方式上比较灵活,在特定场景下效率更高。
        - SQL数据库稍显不同,但不容易出错,能够适用大部分的应用场景。
        - 大型项目通常会同时需要多种数据库,比如使用MySQL作为主数据库存储用户资料和文章,使用Redis缓存数据,使用MongoDB存储实时消息。

ORM魔法

  • 使用原生SQL语句操作数据库的2类问题:
    • 降低代码的可读性,且容易引发安全问题,如SQL注入;
    • 常见的开发模式是在开发时使用简单的SQLite,而在部署时切换到MySQL等更健壮的DBMS。但不同的DBMS需要使用不同的Python接口库,是的DBMS的切换变得不易;
  • ORM把底层的SQL实体转换成高层的Python对象,主要实现了3层映射关系:
    • 表 -> Python类
    • 字段 -> 类属性
    • 记录 -> 类实例
  • 使用ORM具有以下优点:
    • 灵活性好:既能使用高层对象来操作数据库,又支持原生SQL语句;
    • 提升开发效率
    • 可移植性好:ORM支持MySQl、Oracle等DBMS,只需改动少量配置,就可以随意更换DBMS;

使用Flask-SQLAlchemy管理数据库

  • pipenv install flask-sqlalchemy
  • from flask_sqlalchemy import SQLALchemy
  • db = SQLAlchemy(app)

        以上完成扩展的初始化,db代表我们的数据库,它可以使用SQLAlchemy提供的所有功能。大多数情况下,我们不需要手动从SQLAlchemy导入类或函数。在sqlalchemy和sqlalchemy.orm模块中实现的类和函数,以及其它几个常用的模块和对象都可以作为db对象的属性调用。

连接数据库服务器

  • 使用指定的数据库URI(统一资源标识符)链接数据库服务器;Flask-SQLAlchemy中,数据库的URI通过配置变量SQLALCHEMY_DATABASE_URI设置,默认为SQLite内存内存型数据库(sqlite:///);SQLite是基于文件的DBMS,不需要设置数据库服务器,只需要指定数据库文件的绝对路径;
  • SQLite数据库不限制文件后缀名,通常为foo.sqlite/foo.db/foo.sqlite3
  • SQLAlCHEMY_TRACE_MODIFICATIONS配置变量决定是否跟踪对象的修改,用于Flask-SQLAlchemy的事件通知系统。这个配置键的默认值为None,如果没有特殊需要,可以设为False来关闭警告;

定义数据库模型

  • 所有的模型类都要继承Flask-SQLAlchemy提供的db.Model基类,表的字段由db.Column()定义,字段的类型由Column的第一个参数传入,SQLAlchemy常见的字段类型:
    • db.Integer 
    • db.String 可选参数Length用来设置最大长度
    • db.Text 较长的Unicode文本
    • db.Date 存储python的datetime.date对象
    • db.Time datetime.time对象
    • db.DateTime datetime.datetime对象
    • db.Interval
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值