只有Python女程序员才知道的PonyORM

开发项目时,经常会用到ORM,而Python里能用的ORM其实也没几个,以我目前的开发经验来看,比较顺手的ORM有Django内置的那个,或是写Flask时,可以配合使用大佬封装好的Flask-SQLAlchemy。而它们都与框架绑定,当你想在Web应用之外的项目里使用ORM,体验就没这么优雅了。当你要直接使用SQLAlchemy时,它才向你展现出它的利爪和尖牙——这玩意实在是太特么难用了。

当然,人一切的痛苦,都是对自己无能的愤怒。SQLAlchemy有着极其强大且丰富的功能,同时也有着与之相匹配的较高的复杂度和上手难度(如果没有Flask-SQLAlchemy这样的东西,光是自己折腾session管理,就能耗费掉无数的青春),用不明白,只能说明自己菜。

面对着像大辞海一样的SQLAlchemy文档,我不禁陷入沉思—— 人活着到底是为了什么 。ORM原本是为了降低心智负担,提高开发效率和质量,而用这么复杂的一个东西,我的开发效率已经不知道低到哪里去了。更何况用Flask这样轻量化的框架,配合这样重量级的ORM,怎样都觉得十分怪异。

直到我遇到了她。

只有Python女程序员才知道的PonyORM

不对,似乎放错图了。

只有Python女程序员才知道的PonyORM

PonyORM 是我最近开始尝试在实际项目中使用的ORM,它优雅的使用方式,简单的上手难度,以及不错的开发效率,让我眼前一亮,相当Pythonic!

其实以前曾经听说过这玩意,但当时它是以AGPLv3授权,就没去关注,但在2016年底的0.7版本开始,改为了Apache 2.0许可,这样就友好了许多,值得一用了。

简单描述一下它的特性:

  • 方便的查询书写方式(基于解析lambda和生成器语法树的黑魔法)
  • 简洁的Model定义方式(大部分基于语言内置类型进行定义)
  • 自动的数据库事务管理
  • 支持MySQL, PostgreSQL, Oracle, SQLite数据库
  • 在线的图形化Model编辑器 Online Editor 。可以通过画ER图来定义你的模型数据表和它们之间的关系,自动生成class代码,以及几种数据库的建表语句

例子:博客应用

那么接下来以一个常见的博客应用为例,来看看如何使用这个PonyORM,这里不涉及web,仅包含与orm相关的部分。PonyORM更复杂的使用方式以及介绍请参考它的 文档

安装

pip install ponyorm

如果你用MySQL,需要装个相应的底层驱动 pymysql ,其他的数据库类似,具体参考文档 Connecting to the Database

导入

from pony.orm import *

数据库连接

# 创建数据库对象 db = Database()
# 建立数据库连接db.bind(provider='mysql', host='localhost', user='user', passwd='pass', db='mydb')

定义模型

class Post(db.Entity): post_pk = PrimaryKey(int, auto=True) title = Required(str) content = Optional(LongStr) published_at = Required(datetime, default=datetime.now) categories = Set("Category") comments = Set("Comment")
class Category(db.Entity): name = Required( str) posts = Set("Post")
class Comment(db.Entity): post = Optional(Post) content = Required( str) published_at = Required(datetime, default=datetime.now)

对于关联关系,它自动帮你生成外键,以及关联表。如果你没指定主键字段,它会生成一个默认的自增主键字段。

生成mapping并建表

db.generate_mapping(create_tables=True)

插入数据

with db_session: Post(title="第一篇文章", content="Hello world") commit()

所有对数据库的读写都要在db_sesion中进行,除了通过with当作context manager使用,也可以作为装饰器,让db_session对整个函数中有效(并且db_session允许嵌套)

更新了数据记得commit提交。

@db_session def create_post(title, content): Post(title=title, content=content) commit()create_post(title="第2篇文章", content="Hello world too")create_post(title="第3篇文章", content="Hello world 3")

修改数据

with db_session: p = Post. get(post_pk=1) # 使用 get来获取一条数据,如果没有查到会返回None p.content = "new content" commit()

关联数据操作

给第一篇post添加一些评论吧。

with db_session: p = Post.get(post_pk=1) Comment( content="你瞅啥", post=p) Comment( content="瞅你咋地", post=p) commit() # 查看关联的数据 print(p.comments)

之后就可以通过 p.comments 取到与之关联的评论。

那么再来试试多对多关系。

with db_session: c1 = Category(name="tech") c2 = Category(name="blog") commit() Post(title="第5篇文章", content="Hello world too", categories=[c1]) Post(title="第6篇文章", content="Hello world 3", categories=[c1, c2]) commit() # 查看关联的数据 print( Category["tech"].posts) # 这个 Category["tech"]等同于Category.get("tech") print(Post[6].categories)

删除

调用Entity实例的 .delete() 方法可以删掉这条数据。如果需要把相关联的数据一并删掉,需要在定义model字段的时候加上 cascade_delete=True 的参数。

with db_session: Category["tech"].delete() commit()

查询

PonyORM的查询方式比较魔性,和别的ORM有较大区别,这里给个简单的例子看看样子。

用Entity对象上的select方法,传入lambda表达式进行查询,查了id大于2并且内容包含"world"的条目。

with db_session: query = Post.select( lambda p: p.post_pk > 2 and "world" in p.content) print(list(query)) # 将query对象转为list,触发真正的查询获取数据

使用另一种方式用select函数,传入一个生成器表达式作为参数,查询了以"咋地"结尾的Comment。

with db_session: query = select(p.content for p in Comment if p.content.endswith("咋地")) print( query[:]) # 另一种转 list的方式

使用SQL直接查询。

with db_session: query = Category.select_by_sql(" SELECT * FROM category LIMIT 1") print(query[:])

总结

PonyORM的魔法黑到飞起,写起来还是比较爽的,但由于没有太过深入使用过这个框架,这些黑魔法在复杂查询时效果未知(实在不行你可以直接写raw sql嘛,感觉也没太大问题)。我目前在公司的项目中已经用它替换掉了SQLAlchemy,目前感觉良好,运行比较平稳,还没踩到什么坑。(FLAG)

那么欢迎你也成为爱马仕,一起踩坑~★

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Python黑马程序员,我可以提供一些相关的信息。Python黑马程序员是指在Python编程方面具有出色能力和技术水平的开发者。他们通常具备扎实的Python基础知识,并且能够熟练运用Python进行软件开发、数据分析、人工智能等领域的工作。 Python黑马程序员通常具备以下特点: 1. 扎实的Python基础知识:熟悉Python的语法、数据类型、函数、类等基本概念,并能够熟练运用这些知识进行编程。 2. 广泛的应用领域:能够将Python应用于不同领域的开发工作,如Web开发、数据分析、机器学习、自然语言处理等。 3. 解决问题的能力:擅长运用Python编程解决实际问题,具备良好的问题分析和解决能力。 4. 学习和进步的态度:持续学习新的技术和工具,保持对技术的敏感性,并能将新知识应用到实践中。 如果你想成为一名Python黑马程序员,建议你从以下几个方面入手: 1. 学习Python基础知识:掌握Python的语法、数据类型、函数、类等基本概念,并通过编写小项目来加深理解。 2. 深入学习Python相关的库和框架:如Django、Flask、NumPy、Pandas、Scikit-learn等,根据自己的兴趣和需求选择学习。 3. 多实践、多项目经验:通过参与实际项目或者自己构思小项目来提升编程技巧和解决问题的能力。 4. 关注技术社区和技术博客:保持对新技术和行业动态的关注,学习他人的经验和分享。 希望以上信息对你有所帮助!如果有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值