12. 数组数据类型支持
概述
从Pony 0.7.7.7版本开始,我们为PostgreSQL、CockroachDB和SQLite增加了对数组类型的支持,它实现了PostgreSQL的数组类型,JSON类型更灵活,但在某些情况下,Array类型可能更有效。
声明一个Array属性
每个数组都应该有一个指定类型的项目,这个数组可以存储。支持的类型有:int、float和str
。
在Pony中声明一个数组属性时,你应该使用IntArray
、FloatArray
或StrArray
类型,这些类型可以从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')