概述
- 数据库是指由存储数据的多个或多个文件组成的集合,是一种容器;管理数据库的软件被称为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