支持PostgreSQL的Django HStore。

hstore-field-caseinsensitive的Python项目详细描述


#hstore field

[`hstore`](http://www.postgresql.org/docs/9.0/interactive/hstore.html)
postgresql到django的扩展,假设使用的是django 1.3+,
postgresql 9.0+,psycopg 2.3+。

[jordanm/django hstore](http://github.com/jordanm/django-hstore)和
[niwibe/django orm extensions](https://github.com/niwibe/django orm extensions)盗版,但它使用完全不同的机制来扩展django,它具有以下优势:

1。不需要自定义数据库后端(代价是不支持hstore字段上的
索引)
1。不需要自定义QuerySet类,使其与
Geodjango或任何其他执行QuerySet子类
1的扩展完全兼容。支持查询中的范围查找类型(例如,``uu lt`,``uu gt`,等等…)
1。主要与South兼容(具体请参见下面的限制)


hstore field将在您向字段写入
时将数字和日期转换为字符串,但当从数据库中检索到hstore字典时,它*不会将它们*转换回原始类型。您可以将自定义的
类序列化到hstore,方法是给它一个'to-hstore'方法,该方法必须返回
一个字符串。
-hstore字段将使用'connection-created'信号自动尝试在您连接到的任何
数据库上安装configure hstore。如果将
连接到多个数据库,则可能会出现问题。
-使用south将具有"null=false"的hstorefield添加到现有模型中是有问题的,因为south无法为默认值发出正确的sql。一种解决方法是通过将sql直接放入迁移中来添加列

``python
def forwards(self,orm):
db.execute('alter table"[table]"add column"[column]"hstore not null default hstore(array[]::varchar[];')
```

alternative是添加带有"null=true"的字段,填充该字段,
然后设置"null=false"。这实际上通常被认为是良好的实践,
,因为默认值可能会导致意外的问题。

hstore必须安装在postgresql contrib文件夹中
1。如果您运行的是postgresql 9.0,那么包含"pg廑config"
的目录必须在您的"path"上


\usage


模型定义很简单:

from django.db import models
from hstore廑field import fields

class item(models.model):
name=models.charfield(最大长度=64)
data=fields.hstorefield()
````


empty=item.objects.create(name='empty')
assert empty.data=={}

empty.data['a]='1'
empty.save()
assert item.objects.get(name='something').data['a]==1'
```

r/>`` python
来自hstore_field.query import hq

```

您还可以查询hstore值:

`` python
t值
item.objects.filter(hq(data'uu a'u a'u a'u a'u a'uu a'u accucuu a'a'u exact'1']])相当于item.objects.filter(hq(data'u a'u a'u in=['1','2']])


sub子集按范围查询使用整数
item.objects.filter(hq(data'u a'u a'u a'u a'u accuu a'1']])
filter(hq(data'u a'u a'u a'u a'u a'u a'u a'u a'a'lt=1))

#使用float
item.objects.filter的按范围子集查询(hq(data_u a_u gt=1.1))

作为时间戳的按范围子集查询
item.objects.filter(hq(data_u a_u lte=datetime.datetime(2012,1,1,0,15))

作为日期的按范围子集查询
item.objects.filter(hq(data_u a_u gte=datetime.date(2012,1,1)))


类型将导致查询失败。

"hq"对象可以像"q"对象一样,使用`&;`、` `和` ~ `组合。但
它们只能与其他"hq"对象组合,而不能与任何"q"对象组合。
若要将"hq"对象与"q"对象组合,必须首先将"hq"对象包装到"q"对象中。例如:

`` python
item.objects.filter(hq(data_u a_u lt=10)&hq(data_u b_u lt=20))是!

item.objects.filter(q(hq(data_u a_u lt=10))&q(data_u name="foo"))是的!

item.objects.filter(hq(data_u a_u lt=10)&q(data_u name="foo"))否!
```

range查询不是特别快,因为它们需要表扫描,并且需要将每个记录的hstore->;键从字符串转换为另一种类型。但是,
它比将整个表作为
django模型对象发送到应用程序层并在那里过滤它们快得多(在有限的测试中,速度快了3-6倍)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何用java表示这个数学函数的算法   Java/Stream帮助:仅使用streams将嵌套的映射列表转换为映射   使用Selenium连接到数据库时发生java未知主机异常   java如何了解jvm内存使用:“堆内存”和“堆外内存”   java Oracle BI报告导入模板   java如何使用Spring将xml转换为bean?   java线程。join()以保证执行顺序   java从THINGSPEAK到ANDROID应用程序获取JSON数据   使用Java的stanford库中的异常   java正确使用来自其他类文件的方法   如果集合中的元素类型为接口类型,如何填充集合?(爪哇)   记录java。util。记录器创建的文件超过了应有的数量   类Java对象uniq值   尝试调用无法应用于()的方法时出现java错误