Python ORM Pony SQLite数据库 常用操作

Pony是一个高级的对象关系映射器ORM框架。Pony它能够使用Python生成器表达式和lambdas向数据库编写查询。Pony分析表达式的抽象语法树,并将其转换为SQL查询。支持SQLite, MySQL, PostgreSQL和Oracle等数据库,本文主要介绍Python ORM Pony中SQLite数据库常用操作,及数据增加、删除、修改和查询。

1、SQLite数据库

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库。SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如是个很小型的应用,或者需要做嵌入式开发,没有合适的数据库系统,则可以考虑使用SQLite。Python2.5之后,内置了SQLite3,成为了内置模块,不需要额外安装。

2、SQLite功能特性

1)ACID事务

2)零配置,无需安装和管理配置

3)储存在单一磁盘文件中的一个完整的数据库

4)数据库文件可以在不同字节顺序的机器间自由的共享

5)支持数据库大小至2TB

6)足够小, 大致13万行C代码, 4.43M

7)比一些流行的数据库在大部分普通数据库操作要快

8)简单的API

9)包含TCL绑定, 同时通过Wrapper支持其他语言的绑定

10)良好注释的源代码, 并且有着90%以上的测试覆盖率

11)独立,没有额外依赖

12)源码完全的开源, 可以用于任何用途, 包括出售它

13)支持多种开发语言,C, C++, PHP, Perl, Java, C#,Python, Ruby等

3、Pony SQLite常用操作

使用Pony ORM操作SQLite进行数据增加、删除、修改和查询,示例代码如下,

from __future__ import absolute_import, print_function

from decimal import Decimal
from pony.orm import *


db = Database("sqlite", "demo.sqlite", create_db=True)

class Customer(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    email = Required(str, unique=True)
    orders = Set("OrderInfo")

class OrderInfo(db.Entity):
    id = PrimaryKey(int, auto=True)
    total_price = Required(Decimal)
    customer = Required(Customer)
    items = Set("OrderItem")

class Product(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    price = Required(Decimal)
    items = Set("OrderItem")

class OrderItem(db.Entity):
    quantity = Required(int, default=1)
    order = Required(OrderInfo)
    product = Required(Product)
    PrimaryKey(order, product)

sql_debug(True)
db.generate_mapping(create_tables=True)

@db_session
def populate_database():
    c1 = Customer(name='John Smith', email='john@example.com')
    c2 = Customer(name='Matthew Reed', email='matthew@example.com')
    c3 = Customer(name='Chuan Qin', email='chuanqin@example.com')
    c4 = Customer(name='Rebecca Lawson', email='rebecca@example.com')
    c5 = Customer(name='Oliver Blakey', email='oliver@example.com')

    p1 = Product(name='Kindle Fire HD', price=Decimal('284.00'))
    p2 = Product(name='Apple iPad with Retina Display', price=Decimal('478.50'))
    p3 = Product(name='SanDisk Cruzer 16 GB USB Flash Drive', price=Decimal('9.99'))
    p4 = Product(name='Kingston DataTraveler 16GB USB 2.0', price=Decimal('9.98'))
    p5 = Product(name='Samsung 840 Series 120GB SATA III SSD', price=Decimal('98.95'))
    p6 = Product(name='Crucial m4 256GB SSD SATA 6Gb/s', price=Decimal('188.67'))

    o1 = OrderInfo(customer=c1, total_price=Decimal('292.00'))
    OrderItem(order=o1, product=p1)
    OrderItem(order=o1, product=p4, quantity=2)

    o2 = OrderInfo(customer=c1, total_price=Decimal('478.50'))
    OrderItem(order=o2, product=p2)

    o3 = OrderInfo(customer=c2, total_price=Decimal('680.50'))
    OrderItem(order=o3, product=p2)
    OrderItem(order=o3, product=p4, quantity=2)
    OrderItem(order=o3, product=p6)

    o4 = OrderInfo(customer=c3, total_price=Decimal('99.80'))
    OrderItem(order=o4, product=p4, quantity=10)

    o5 = OrderInfo(customer=c4, total_price=Decimal('722.00'))
    OrderItem(order=o5, product=p1)
    OrderItem(order=o5, product=p2)

    commit()
populate_database()
#查询
@db_session
def query():
    print(select(p for p in Product if p.id==3)[:])
    #多条数据会报错:pony.orm.core.MultipleObjectsFoundError: Multiple objects were found. Use Customer.select(...) to retrieve them
    #通过pk获取
    print(Product[1].name)
    print(Customer.get(id=1).name)
    print(Customer.select(lambda c: c.id==1)[:][0].name)
    y = 1
    print(Product.select_by_sql("SELECT * FROM Product WHERE id=$(y*2)")[0].name)

@db_session
def update():
    c1 = Customer.get(id=1)
    c1.name="john"
    p1 = select(p for p in Product if p.id==3)[:][0]
    p1.name="cjavapy"
    c2 = Customer.get(id=2)
    #更新多个字段
    #c.name="cjavapy"
    #c.email="cjavapy@gmail.com"
    c2.set(name="cjavapy",email="cjavapy@gmail.com")
    
@db_session
def delete():
    p = Product[1]
    p.delete()
    # 或者:
    #delete(p for p in Product if p.id >=5)
    # 或:
    #使用bulk=True参数是一条delete语句批量删除,否则是先select满足条件数据,然后每次删除一个
    Product.select(lambda p: p.id >=5).delete(bulk=True)
    
query()
update()
delete()

相关文档:

Python ORM Pony 常用表连接聚合操作(sum()、count()、min()、max()、avg()等)

Python ORM Pony 常用操作(增删改查)

Python ORM Pony 事务和db_session

推荐阅读
cjavapy编程之路首页