ORM 江湖#####
曾几何时,程序员因为惧怕
SQL
而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者为了获取一些数据,什么内外左右连接,函数存储过程等等。毫无疑问,不搞懂这些,怎么都觉得变扭,说不定某天就跳进了坑里,叫天天不应,喊地地不答。
ORM
的出现,让畏惧SQL的开发者,在坑里看见了爬出去的绳索,仿佛天空并不是那么黑暗,至少再暗,我们也有了眼睛。顾名思义,ORM 对象关系映射,简而言之,就是把数据库的一个个
table
(表),映射为编程语言的
class
(类)。
python
中比较著名的ORM框架有很多,大名顶顶的
SQLAlchemy
是python世界里当仁不让的
ORM
框架。江湖中
peewee
,
strom
,
pyorm
,
SQLObject
各领风骚,可是最终还是SQLAlchemy 傲视群雄。
SQLAlchemy 简介#####
SQLAlchemy 分为两个部分,一共用于 ORM 的对象映射,另外一个是核心的
SQL expression
。第一个很好理解,纯粹的ORM,后面这个不是 ORM,而是
DBAPI
的封装,当然也提供了很多方法,避免了直接写sql,而是通过一些sql表达式。使用 SQLAlchemy 则可以分为三种方式。
使用 sql expression ,通过 SQLAlchemy 的方法写sql表达式,简介的写sql
使用 raw sql, 直接书写 sql
使用 ORM 避开直接书写 sql
本文先探讨 SQLAlchemy的 sql expresstion 部分的用法。主要还是跟着官方的 SQL Expression Language Tutorial.介绍
为什么要学习 sql expresstion ,而不直接上 ORM?因为后面这个两个是 orm 的基础。并且,即是不使用orm,后面这两个也能很好的完成工作,并且代码的可读性更好。纯粹把SQLAlchemy当成dbapi使用。首先SQLAlchemy 内建数据库连接池,解决了连接操作相关繁琐的处理。其次,提供方便的强大的log功能,最后,复杂的查询语句,依靠单纯的ORM比较难实现。
实战#####
连接数据库######
首先需要导入 sqlalchemy 库,然后建立数据库连接,这里使用
mysql
。通过
create_engine
方法进行
from sqlalchemy import create_engine
engine = create_engine("mysql://root:@localhost:3306/webpy?charset=utf8",encoding="utf-8", echo=True)
create_engine
方法进行数据库连接,返回一个 db 对象。里面的参数表示
数据库类型://用户名:密码(没有密码则为空,不填)@数据库主机地址/数据库名?编码
echo = True 是为了方便 控制台 logging 输出一些sql信息,默认是False
通过这个engine对象可以直接execute
进行查询,例如 engine.execute("SELECT * FROM user")
也可以通过 engine 获取连接在查询,例如 conn = engine.connect()
通过 conn.execute()
方法进行查询。两者有什么差别呢?
直接使用engine的execute执行sql的方式, 叫做connnectionless执行
,
借助 engine.connect()获取conn, 然后通过conn执行sql, 叫做connection执行
主要差别在于是否使用transaction模式, 如果不涉及transaction, 两种方法效果是一样的. 官网推荐使用后者。
定义表#####
定义数据表,才能进行sql表达式的操作,毕竟sql表达式的表的确定,是sqlalchemy制定的,如果数据库已经存在了数据表还需要定义么?当然,这里其实是一个映射关系,如果不指定,查询表达式就不知道是附加在那个表的操作,当然定义的时候,注意表名和字段名,代码和数据的必须保持一致。定义好之后,就能创建数据表,一旦创建了,再次运行创建的代码,数据库是不会创建的。