python之sqlalchemy详解
python之sqlalchemy详解
SQLAlchemy连接数据库
可以使用ORM框架操作数据库
ORM框架 = object relationship mappiy 框架
学习前提(软件)
mysql、pymysql(或者MySQLdb)、SQLAlchemy
SQLAlchemy连接数据库
步骤
- 首先导入sqlalchemy.create_engine
- 输入配置信息(服务器ip,端口号,数据库名,账户,密码)
- 传递一个满足某种格式的字符串
dialect+driver://username:password@host:port/database?charset=utf8
dialect:数据库的实现,比如MySQL、PostgreSQL、SQLite,并且转换成小写。
driver:Python对应的驱动,python3对应sqlalchemy,python2对应MySQLdb。
username:连接数据库的用户名
password:连接数据库的密码
host:连接数据库的域名
- 创建数据库引擎
- 创建连接
代码实现
1 |
|
拓展:用SQLAlchemy执行原生SQL
1 |
|
ORM框架
ORM:Object Relationship Mapping(对象模型与数据库表的映射)
Python代码和SQL代码的对应关系
py代码:
class Person(object):
name = ‘xx’
age = 18
country =’xx
对应关系:
Person类 -> 数据库中的一张表
Person类中的属性 -> 数据库中一张表字段
Person类的一个对象 -> 数据库中表的一条数据
使用原生sql语句的缺点
- SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长,会出现很多相近的SQL语句。
- 大型的项目是在业务逻辑中拼接出来的,如果数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。
- 写SQL时容易忽略web安全问题,造成隐患。
SQLAlchemy的优势
- 易用性:使用ORM做数据库开发可以有效减少重复SQL语句的概率,写出来的模型也更加直观、清晰
- 性能损耗小:任何操作都要通过ORM转化,确实会损耗性能,但综合考虑开发效率、代码阅读性,带来的好处远大于性能损耗,而且项目越大作用越明显。
- 设计灵活:可以轻松的写出复杂的查询
- 可移植:SQLAlchemy封装了底层的数据库实现,支持多个关系数据库引擎,可以非常轻松的切换数据库
SQLAlchemy操作数据库
操作前,必须要先构建session对象!!
定义ROM模型映射到数据库中
步骤:
- 用declarative_base根据engine创建一个ORM基类。
- 用这个Base类作为基类来写自己的ORM类。要定义
__tablename__
类属性,来指定这个模型映射到数据库中的表名。 - 创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型
- 使用
Base.metadata.create_all()
来将模型映射到数据库中。
注意:
使用create_all函数创建的表映射到数据库之后,即使改变了模型的字段,也不会重新映射了。
体现为代码中,后加的nick项,没有办法实现。
解决方法:每次运行时,先把之前的表全部删除之后,在创建新的表。
代码实现:
1 |
|
对数据的增删改查操作(crud→增删改查)
crud功能指的就是增删改查。
步骤:
构建session对象,所有的所有和数据库的ORM操作都必须通过一个叫做
session
的会话对象来实现对表添加数据{add(),add_all([])}
查询表中数据
- 全表查询 查找某个模型对应的那个表中所有的数据
all_person = session.query(Person).all() - 条件查询 filter_by
all_person = session.query(Person).filter_by(name=’momo1’).all() - 条件查询 filter
all_person = session.query(Person).filter(Person.name==’momo1’).all() - 条件查询 get方法是根据id来查找的,只会返回一条数据或者None
person = session.query(Person).get(primary_key) - 条件查询 使用first方法获取结果集中的第一条数据
person = session.query(Person).first()
- 全表查询 查找某个模型对应的那个表中所有的数据
修改对象
首先从数据库中查找对象,然后将这条数据修改为你想要的数据,最后做commit操作就可以修改数据了删除对象
将需要删除的数据从数据库中查找出来,然后使用session.delete方法将这条数据从session中删除,最后做commit操作就可以了。
代码实现:
1 |
|
Column常用数据类型
常用的数据类型,一共是有11个。
注:在SQLAlchemy中不存在double数据类型,使用 DECIMAL类型替代
让我们来分别看下这11个数据类型都有哪些?
- Integer:整型,映射到数据库中是int类型。
- Float:浮点类型,映射到数据库中是float类型。他占据的32位。
浮点类型,有可能会造成精度丢失,特别是在money方面,不可原谅。 - Double(SQLAlchemy中没有,代替品为DECIMAL):双精度浮点类型,映射到数据库中是double类型,占据64位
- String:可变字符类型,映射到数据库中是varchar类型.
- Boolean:布尔类型,映射到数据库中的是tinyint类型。
- DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储money相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。
- Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举。
- Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用
datetime.date
来指定。 - DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用
datetime.datetime
来指定。 - Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用
datetime.time
来指定
ps:注意区分Date/DateTime/Time的储存信息!!! - Text:存储长字符串。一般可以存储6W多个字符
- LONGTEXT:长文本类型,映射到数据库中是longtext类型(不过这个只有mysql有,orcale没有)
上述就是11个数据类型,因为这里把不存在的double也添加上了,所以看起来是12个。
下面就让咱们一起来进行验证。
代码实现
1 |
|
Column常用约束参数
在给数据库表指定key的时候,必然要给它们添加,例如:不可空,字节长度等等的限制,这就需要约束参数的出场了。常用的约束参数一共有7种
常见约束参数
约束参数描述,功能primary_keyTrue设置某个字段为主键autoincrementTrue设置这个字段为自动增长的default设置某个字段的默认值。在发表时间这些字段上面经常用nullable指定某个字段是否为空。默认值是True,就是可以为空unique指定某个字段的值是否唯一。默认是False。onupdate在数据更新的时候会调用这个参数指定的值或者函数。在_第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值_。常用于是update_time
字段(每次更新数据的时候都要更新该字段值)。name指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。这个参数也可以当作位置参数,在第1个参数来指定。
代码实现
1 |
|
Query查询函数,可以传递的参数有哪些?
Query查询函数传递的参数无非就是分为三类,分别是模型名、模型中的属性、聚合函数,那下面就简单的说明,
模型名
指定查找该模型中所有属性(对应查询为全表查询)
模型中的属性
可以指定只查找某个模型的其中几个属性
聚合函数
聚合函数一共有五个,都被放到了sqlalchemy的func模块中。
- func.count:统计行的数量
- func.avg:求平均值
- func.max:求最大值
- func.min:求最小值
- func.sum:求和
代码实现
1 |
|