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: 后面接上获取代码。