在代码里手写 SQL 并不是一件愉快的事情,故而,代码中往往使用 ORM,把代码中定义的数据模型、查询和数据操作转换为 SQL 语言来操作数据库 。不同的 ORM,对于数据库操作的抽象程度也有所不同,抽象程度更高的 ORM,往往能够写出更为贴合编程语言的数据操作代码,且对 SQL 的转换有更为智能的处理,隐去更多无需关注的底层细节,使代码变得更为优雅,提高开发效率 。Pony,就是一个具有高抽象程度的 Python 语言的 ORM 框架,其优雅的语法,甚至支持使用 Python 中的列表推导式进行数据库查询 。

文章插图
Pony ORM库
简介Pony,是 ponyorm 在 Github 上开源的 Python ORM 框架,项目位于 https://github.com/ponyorm/pony,目前版本为 0.7.13 。Pony 提供了十分 Pythonic 的 API,易于学习,使用方便 。Pony 提供了基于实体的数据模型定义,精简的查询语法,全面的报错信息,并能输出可读性强的生成的 SQL 语句 。这些大大提升了开发效率,使得使用 Python 语言进行数据库操作更为方便 。相比于已有的 Django 和 SQLAlchemy 等 ORM,Pony 提供了 IdentityMap 模式,自动的事务管理,自动的查询和数据缓存,以及对于高级 SQL 语法的支持等 。

文章插图
Pony ORM库
安装Pony 支持 Python 2.7 和 Python 3,可以使用 pip 安装:
pip install ponyPony 目前支持的数据库包括 SQLite、PostgreSQL、MySQL、Oracle CockroachDB 。当使用 SQLite 时,无需额外的依赖,而使用其他的数据库,需要安装对应的驱动 。
文章插图
Pony 项目
示例Pony 使用十分简单 。首先,需要实例化数据库,连接到对应的数据库后端:
from pony.orm import *db = Database("sqlite", "estore.sqlite", create_db=True)【Pony - 最智能的 Python ORM 框架】使用 create_db 参数进行数据库创建 。也可以先创建一个数据库实例,之后再进行绑定:db = Database()db.bind(provider='sqlite', filename='database.sqlite', create_db=True)Pony 使用实体关系模型作为数据模型:class Person(db.Entity):name = Required(str)age = Required(int)cars = Set('Car')class Car(db.Entity):make = Required(str)model = Required(str)owner = Required(Person)对于数据模型 Person,定义了3个属性:name,一个非空的字符串;age,一个非空的整数;cars,一个数据关系,是一个指向实体 Car 的集合,表示这个人所拥有的车辆集合 。相似地,在实体 Car 中,定义了属性 owner,指向 Person,表示车辆对应的拥有者 。通过这两个关系,我们就实现了 Person 和 Car 之间一对多的数据关系 。Pony 还提供了一个方便的工具函数 show,用来打印实体的定义:>>> show(Person)class Person(Entity):id = PrimaryKey(int, auto=True)name = Required(str)age = Required(int)cars = Set(Car)注意到,Person 比代码中的定义多了一个 id 属性,这是因为我们没有定义主键,故而 Pony 自动添加了一个 id 主键 。在定义了数据实体后,我们需要把它们映射到数据库的数据表:
db.generate_mApping(create_tables=True)使用 create_tables 参数,当表不存在时自动创建 。在完成了数据模型的定义后,就可以进行数据实例的创建:
>>> p1 = Person(name='John', age=20)>>> p2 = Person(name='Mary', age=22)>>> p3 = Person(name='Bob', age=30)>>> c1 = Car(make='Toyota', model='Prius', owner=p2)>>> c2 = Car(make='Ford', model='Explorer', owner=p3)>>> commit()在调用 commit 后,会产生 SQL 的 INSERT 语句,把所有数据实例插入到数据库中 。也可以使用 db_session 上下文,对 session 进行自动管理:with db_session:p = Person(name='Kate', age=33)Car(make='Audi', model='R8', owner=p)Pony 提供了十分优雅的查询方式,可以使用 Python 的生成器表达式和 lambda 函数进行数据库查询 。我们来看一个基本例子:>>> select(p for p in Person if p.age > 20)<pony.orm.core.Query at 0x105e74d10>这里,使用了 Pony 的 select 接口,对数据库进行查询,查询所有年龄大于20岁的人的记录,返回一个 Query 对象 。想要得到数据列表,我们支持使用列表的范围切片语法:>>> select(p for p in Person if p.age > 20)[:]SELECT "p"."id", "p"."name", "p"."age"FROM "Person" "p"WHERE "p"."age" > 20[Person[2], Person[3]]
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 外包面试之旅
- 最赚钱的10家上市公司:程序员群体“含金量”第一
- 优傲机器人与如影智能签订战略协议,加速机械臂进入消费级市场
- 智能硬件不止树莓派,八款优秀智能硬件开源项目推荐
- 产后什么时候练瑜伽最好
- 喝绿茶的最佳时间,喝狗脑贡茶的最佳时间
- 女生学跆拳道到底好吗
- 跑步的最佳时候是什么
- 美国探测器回望地球 现在距离地球最远的探测器
- 电影|《侏罗纪世界3》公布最终预告片:人龙对决命悬一线
