cdhigh 发表于 2014-07-13 19:43

推荐python的ORM框架peewee

以下是自己在一些项目中的简单心得,无他,旨在向一些不了解peewee的新手推荐一个顺手的工具,提供开发效率。至于具体使用细节,官方文档还是读一下吧,简单的文字。
熟手跳过。

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

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

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

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

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

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

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

#示范一个表
class User(MyBaseModel):
    name = CharField(unique=True)
    password = CharField()
    group = CharField(default='admin')
    value = FloatField(default=0.0)

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

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

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

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

#删除
user.delete_instances()

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


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

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

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

webdna 发表于 2014-07-13 21:57

:lol帮顶:lol
页: [1]
查看完整版本: 推荐python的ORM框架peewee