支持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控制台客户端的SOAP消息   java camunda异常找不到id为空的任务任务   java如何将json文件转换为以下格式{“Description”:“Cmd是一个开源工具”,数据{“别名”:“xCmd”,“软件”:“xCmd”,“_raw”:“}   java在Hibernate期间清理连接池花费的时间太长   用Java实现基本FTP客户端的socket   Java生成文本文件格式的格式化报告   java hibernate createQuery vs get   TriggerBuilder<Trigger>类型中带有Schedule(ScheduleBuilder<SBT>)的java不适用于参数(可变触发器)   JavaSwing:GlassPane防止鼠标指针更改   java使用for循环创建上下三角形   maven“Java Home”在cmd中运行“mvn v”时不显示   java客户端无法联机连接到服务器   java面向对象程序设计问题   java如何按升序和降序对hashmap数据进行排序   java为什么JPanel从不调用reapint