Ponyorm学习笔记 - littleboy12580/learning_python GitHub Wiki

介绍

Ponyorm是一个比较小众的orm框架,相比于sqlalchemy而言更加轻巧,不过相对应有些功能也不是很完善。因为项目中有用到这个框架,所以大体了解了一下。这是个用Python编写的orm框架,它的特点是可以使用类似python的语法来进行sql的查询;其他的优点还有如提供了query和对象的自动缓存等,在此不详述。

使用

创建与数据库的连接(此处以postgresql为例)

from pony.orm import Database

db = Database()
db.bind('postgres',
        user=****,
        password=****,
        host=****,
        database=****)

通过创建Database()实例来创建一个database对象,使用bind来将该database对象连接到远程的实际数据库上。

创建数据表

class Person(db.Entity):
    name = Required(str)

class Student(Person):
    gpa = Optional(Decimal)
    mentor = Optional("Professor")

class Professor(Person):
    degree = Required(str)
    students = Set("Student")

# 其中ponyorm会隐式的加上id主键,所以不需要写id

每个属性都有Required,Optional,PrimaryKey,Set这四种选择;Required代表必须存在,Optional为可选,PrimaryKey代表主键,Set代表关系(例如上例的students就表示一个Progessor有多个Student)
属性具有如下数据结构:

  • str
  • unicode
  • int
  • float
  • Decimal
  • datetime
  • date
  • time
  • timedelta
  • bool
  • buffer - used for binary data in Python 2 and 3
  • bytes - used for binary data in Python 3
  • LongStr - used for large strings
  • LongUnicode - used for large strings
  • UUID
  • Json - used for mapping to native database JSON type

数据映射

db.generate_mapping(create_tables=True)

其中create_tables设为True时会在数据库自动创建对应的数据表。

迁移问题

ponyorm有一个很大的缺陷就是不支持数据迁移,连第三方数据迁移工具也不能使用;所以每次修改数据表的某个属性的时候都得手写sql语句,导致做数据库升级的时候特别麻烦;这个问题从13年在官方github上提出来,至今仍没得到解决。。。

数据获取

@db_session
def print_person_name(person_id):
    p = Person[person_id]
    print p.name
    # database session cache will be cleared automatically
    # database connection will be returned to the pool

@db_session
def add_car(person_id, make, model):
    Car(make=make, model=model, owner=Person[person_id])
    # commit() will be done automatically
    # database session cache will be cleared automatically
    # database connection will be returned to the pool

通过使用db_session装饰器来获取连接池,省去了自己输入add,commit等操作;ponyorm会自动完成add和commit操作; 如果不想使用装饰器,也可以直接 with db_session: 后面接上获取代码。