免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 18073 | 回复: 1
打印 上一主题 下一主题

推荐python的ORM框架peewee [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-13 19:43 |只看该作者 |倒序浏览
以下是自己在一些项目中的简单心得,无他,旨在向一些不了解peewee的新手推荐一个顺手的工具,提供开发效率。至于具体使用细节,官方文档还是读一下吧,简单的文字。
熟手跳过。

你操作数据库时在用繁琐难维护的SQL?还是笨重复杂的SqlAlchemy?或者是你运气够好使用DJANGO而享受其ORM?

我曾经也是有SQlAlchemy,不过几次后难以忍受其复杂和不直观,他号称最佳ORM,但是其高级特性我都用不上,反而因其设计而用的特别别扭。后来我再三搜索和比较,觉得peewee真合我意,用了两个项目后越发感叹,peewee在项目中完全没有存在感,你不会感觉到在使用peewee,而是下意识的操作一些数据,就像python内置一样。(用SQlalchemy每次操作都会知道你在用SA)。

peewee基本上没有中文文档,不过因为其简单(单文件),API设计合理,所以阅读官方文档即可娴熟操作,下面我简单写一点点让你有一个感性认识,至于外键什么的也很简单,为了明了,这里就不写实例了。

peewee我感觉不好的一个就是查询一行(.get())时如果查询不到,会抛出异常,这就导致了每次很多try/except,所以我就在自己的基类中添加了一个getOne()接口,封装其get()接口,查询不到返回None,这样程序就清新多了。
  1. from peewee import *

  2. #创建数据库实例
  3. db = SqliteDatabase('base.db')

  4. #建议自己的项目使用一个新的基类,Model是peewee的基类
  5. class MyBaseModel(Model):
  6.     class Meta:
  7.         database = db

  8.     @classmethod
  9.     def getOne(cls, *query, **kwargs):
  10.        #为了方便使用,新增此接口,查询不到返回None,而不抛出异常
  11.        try:
  12.           return cls.get(*query,**kwargs)
  13.        except DoesNotExist:
  14.            return None

  15. #示范一个表
  16. class User(MyBaseModel):
  17.     name = CharField(unique=True)
  18.     password = CharField()
  19.     group = CharField(default='admin')
  20.     value = FloatField(default=0.0)

  21. #建表,仅需创建一次
  22. User.create_table()

  23. #新增行
  24. User.create(name=name,password=password)

  25. #查询一行
  26. user = User.getOne(User.name='MyGod')
  27. print(user.password)

  28. #更新
  29. user.value += 1
  30. user.save()

  31. #删除
  32. user.delete_instances()

  33. #查询多行
  34. usersInGroup = User.select().where(User.group == 'admin')
  35. usersStartsWithA = User.select().where(User.name ** 'A%')   #不区分大小写的like查询
  36. usersWithOrder = User.select().where(User.group == 'admin').order_by(User.name.desc()) #按姓名倒序排序


  37. #统计admin用户组所有用户的value总和
  38. total = User.select(fn.Sum(User.value).alias('totalvalue')).where(User.group=='admin')

  39. #更新多个(将a打头的用户的value全部更新为1)
  40. User.update(value = 1).where(User.name ** 'A%').execute()

复制代码
其他的一些API,看一下文件就都会了。
peewee的开发者说就是因为他在用SA的时候感觉太复杂了,所以就开发了这个简单的,因为简单,效率也比sa要好。
大部分人其实是不需要特别复杂的SQL特性的,这时候peewee就刚好,郑重推荐!
我之前担心过peewee后续能否持续开发的问题,不过我看其github页面还是在持续更新,暂时不用担心,而且因为其简单,学习成本很小,也不用担心。

论坛徽章:
1
处女座
日期:2014-01-21 13:20:51
2 [报告]
发表于 2014-07-13 21:57 |只看该作者
帮顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP