应用程序最核心的就是数据,每天我们写程序其实也是在处理数据的过程,那么很有必要系统性的讲讲和梳理python的flask框架是如何进行数据交互操作的。
趁这3天假期,分4篇内容来系统的讲讲,今天先分享第一篇。
一、flask构建mysql数据库的正确姿势。
二、flask常用的增删改查用法。
三、flask数据的一对多和多对多的关联查询。
四、flask实战的迁移数据库
1、SQLAlchemy
Flask中最方便用的数据库框架是 flask_sqlalchamy,是对 SQLAlchamy 在 Flask 中的扩展, SQLAlchemy 是一个 Python 数据库工具(ORM,即对象关系映射)。
使用扩展包flask-sqlalchemy来操作数据库(增删改查),通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。可以让我们操作数据库跟操作对象是一样的,非常方便,因为一个表就抽象成一个类,一条数据就抽象成该类的一个对象。
2、安装
pip install flask_sqlalchamy
安装之后,导入到项目中,对应用进行初始化:
from flask_sqlalchamy import SQLAlchamy # 导入 SQLAlachamy
3、连接数据库
最常用的是mysql,最好的方式是写在configure里面,然后在flask的app主文件中通过app.config.from_object(configure)加载即可。
#配置mysql数据库
DIALECT = 'mysql' # 要用的什么数据库
DRIVER = 'pymysql' # 连接数据库驱动
USERNAME = 'root'
PASSWORD = 'XXXX'
HOST = 'XXXXX'
PORT = '3306'
DATABASE = 'hutong'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,DATABASE)
数据库的其他配置
名字 | 备注 |
SQLALCHEMY_DATABASE_URI | 用于连接的数据库 URI 。例如:sqlite:tmp/test.dbmysql://username:password@server/db |
SQLALCHEMY_BINDS | 一个映射 binds 到连接 URI 的字典。更多 binds 的信息见用 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 小时。 |
4、构建模型
假设需要构建一张表Article,如下,新建单独一个python文件,放在models目录下,使用Flask-SQLAlchemy创建模型与表的映射:
模型需要继承自db.Model,然后需要映射到表中的属性,必须写成db.Column的数据类型。该类继承自db.Model,__tablename__代表表名,不写的话默认类名的小写字母为表名。然后再是依次每个表字段的定义。
常用的SQLAlchemy字段类型
类型名 | python中类型 | 说明 |
Integer | int | 普通整数,一般是32位 |
SmallInteger | int | 取值范围小的整数,一般是16位 |
BigInteger | int或long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 普通整数,一般是32位 |
String | str | 变长字符串 |
Text | str | 变长字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长Unicode字符串 |
UnicodeText | unicode | 变长Unicode字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 时间 |
Time | datetime.datetime | 日期和时间 |
LargeBinary | str | 二进制文件 |
常用的SQLAlchemy列选项
选项名 | 说明 |
primary_key | 如果为True,代表表的主键 |
unique | 如果为True,代表这列不允许出现重复的值 |
index | 如果为True,为这列创建索引,提高查询效率 |
nullable | 如果为True,允许有空值,如果为False,不允许有空值 |
autoincrement | 代表的是这个主键为自增长的。 |
default | 为这列定义默认值 |
Flask中使用flask-sqlalchemy时db.create_all()无法创建表
1、导入from flask_demo.models import Role, User # 导入模型类
2、添加应用上下文
3、with app.app_context():
4、db.create_all()
即可轻松新建数据表,当然数据库需要提前建好。