12. 数组数据类型支持

12. 数组数据类型支持

概述

从Pony 0.7.7.7版本开始,我们为PostgreSQL、CockroachDB和SQLite增加了对数组类型的支持,它实现了PostgreSQL的数组类型,JSON类型更灵活,但在某些情况下,Array类型可能更有效。

声明一个Array属性

每个数组都应该有一个指定类型的项目,这个数组可以存储。支持的类型有:int、float和str

在Pony中声明一个数组属性时,你应该使用IntArrayFloatArrayStrArray类型,这些类型可以从pony.orm包中导入。

from pony.orm import *

db = Database()


class Product(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    stars = Optional(IntArray)
    tags = Optional(StrArray)


db.bind('sqlite', ':memory:')
db.generate_mapping(create_tables=True)

 with db_session:
     Product(name='Apple MacBook', stars=[0, 2, 0, 5, 10], tags=['Apple', 'Notebook'])

可选数组默认声明为NOT NULL,并使用空数组作为默认值。要使其为空数组,你应该传递nullable=True选项。

对于PostgreSQL,如果你设置index=True,Pony会创建gin索引,对于SQLite索引将被忽略。

操作数组

访问数组项

在PonyORM中,数组的索引是基于0的,就像Python中一样,可以使用负索引来访问数组的末尾,你也可以使用数组切片。

选择数组中的特定项:

select(p.tags[2] for p in Product)[:] # 第三元素
select(p.tags[-1] for p in Product)[:] # 最后一个元素

使用切片

select(p.tags[:5] for p in Product)[:] # 前五名元素

分片不支持步长(step)

检查项目或项目列表是否在数组中:

select(p for p in Product if 'apple' in p.tags)[:]
select(p for p in Product if ['LCD', 'DVD', 'SSD'] in p.tags)[:]

更改数组中的项目

product = Product.select().first()
product.tags.remove('factory-new')
product.tags.append('reconstructed')

你可能感兴趣的:(12. 数组数据类型支持)