数据库
ORM
ORM 全拼Object-Relation Mapping.
中文意为 对象-关系映射.
主要实现模型对象到关系数据库数据的映射.
ORM图解
优点 :
- 只需要面向对象编程, 不需要面向数据库编写代码.
- 对数据库的操作都转化成对类属性和方法的操作.
- 不用编写各种数据库的sql语句.
- 实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.
- 不在关注用的是mysql、oracle...等.
- 通过简单的配置就可以轻松更换数据库, 而不需要修改代码.
缺点 :
- 相比较直接使用SQL语句操作数据库,有性能损失.
- 根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.
Flask-SQLAlchemy安装及设置
SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。
安装
在创建的flask 虚拟环境中 比如:py3_plask 输入下面指令:
pip install flask-sqlalchemy
如果连接的是 mysql 数据库,需要安装 mysqldb:
pip install flask-mysqldb
数据库连接配置
在 Flask-SQLAlchemy 中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的 SQLALCHEMY_DATABASE_URI
键中。
配置如下:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/my_library'
# 动态追踪修改设置,如未设置只会提示警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
配置好后,去mysql中创建配置中的数据库my_library
$ mysql -uroot -pmysql
$ create database mylibrary charset utf8;
其他配置,仅做了解
名字 备注
SQLALCHEMY_DATABASE_URI
用于连接的数据库 URI 。例如:sqlite:////tmp/test.dbmysql://username:password@server/db
SQLALCHEMY_BINDS
一个映射 binds 到连接 URI 的字典。更多 binds 的信息见用 Binds 操作多个数据库(http://docs.jinkan.org/docs/flask-sqlalchemy/binds.html#binds)。
SQLALCHEMY_ECHO
如果设置为Ture, SQLAlchemy 会记录所有 发给 stderr 的语句,这对调试有用。(打印sql语句)
SQLALCHEMY_RECORD_QUERIES
可以用于显式地禁用或启用查询记录。查询记录 在调试或测试模式自动启用。更多信息见get_debug_queries()。
SQLALCHEMY_NATIVE_UNICODE
可以用于显式禁用原生 unicode 支持。当使用 不合适的指定无编码的数据库默认值时,这对于 一些数据库适配器是必须的(比如 Ubuntu 上 某些版本的 PostgreSQL )。
SQLALCHEMY_POOL_SIZE
数据库连接池的大小。默认是引擎默认值(通常 是 5 )
SQLALCHEMY_POOL_TIMEOUT
设定连接池的连接超时时间。默认是 10 。
SQLALCHEMY_POOL_RECYCLE
多少秒后自动回收连接。这对 MySQL 是必要的, 它默认移除闲置多于 8 小时的连接。注意如果 使用了 MySQL , Flask-SQLALchemy
自动设定 这个值为 2 小时。
连接其他数据库
本整理数据主要用mysql数据库
完整连接 URI 列表请跳转到 SQLAlchemy 下面的文档 (Supported Databases) 。这里给出一些 常见的连接字符串:
-
Postgres:
postgresql://scott:tiger@localhost/mydatabase
-
MySQL:
mysql://scott:tiger@localhost/mydatabase
-
Oracle:
oracle://scott:tiger@127.0.0.1:1521/sidname
-
SQLite (注意开头的四个斜线):
sqlite:////absolute/path/to/foo.db