最近我在尝试使用Djang与Django时遇到了麻烦.我用这种方式安装了hstore:
$ sudo -u postgres psql
postgres=# CREATE EXTENSION hstore;
WARNING: => is deprecated as an operator name
DETAIL: This name may be disallowed altogether in future versions of PostgreSQL.
CREATE EXTENSION
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+--------------------------------------------------
hstore | 1.0 | public | data type for storing sets of (key, value) pairs
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
Run Code Online (Sandbox Code Playgroud)
并天真地认为我的新数据库将包括hstore.情况并非如此:
$ createdb dbtest …Run Code Online (Sandbox Code Playgroud) 当我尝试在我的数据库上启用hstore时:
=> CREATE EXTENSION IF NOT EXISTS hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
Run Code Online (Sandbox Code Playgroud)
我的用户是不是超级用户,但是是数据库的所有者.
加载扩展需要具有创建其组件对象所需的相同权限.对于大多数扩展,这意味着需要超级用户或数据库所有者权限.运行CREATE EXTENSION的用户将成为扩展的所有者,以便以后进行权限检查,以及扩展程序脚本创建的任何对象的所有者.
什么是hstore,需要超级用户权限?它是否会影响我将其添加到数据库外部的群集部分?
进一步的混乱:
数据库用户Heroku Postgres提供的不是超级用户:
Heroku Postgres用户被授予其数据库的所有非超级用户权限.这些措施包括
SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY,EXECUTE,和USAGE.
但是,该用户能够CREATE EXTENSION hstore:
要创建任何支持的扩展,请使用heroku pg:psql打开一个会话并运行相应的命令:
Run Code Online (Sandbox Code Playgroud)$ heroku pg:psql Pager usage is off. psql (9.2.4) SSL …
在完成关系DB/NoSQL研究辩论之后,我得出的结论是,我将继续将PG作为我的数据存储.该决定的一个重要部分是宣布JSONB达到9.4.我的问题是我现在应该怎么做,从头开始构建一个应用程序,知道我想要迁移到(我的意思是现在使用!)jsonb?对我来说,DaaS选项将会运行9.3.
从我所知道的,并纠正我,如果我错了,hstore会运行得更快,因为我将在hstore列中对许多键进行大量查询,如果我要使用普通的json我就不会能够利用索引/ GIN等.但是我可以利用json嵌套,但运行任何查询都会非常慢,用户会感到沮丧.
那么,我是否围绕当前版本的hstore或json数据类型,"good ol"EAV或其他东西构建我的应用程序?我应该以某种方式构建我的数据库和应用程序代码吗?任何建议将不胜感激.我相信其他人可能会面临同样的问题,因为我们等待PostgreSQL的下一次正式发布.
关于我想要构建的应用程序的一些额外细节:
- 非常关系(下面有一个例外) -
强大的社交网络方面(群组,朋友,喜欢,时间轴等) -
基于具有可变用户分配属性的单个对象,可能是10或1000+(这是无模式设计的地方)需要发挥作用)
提前感谢任何输入!
我尝试使用这个很好的教程使用django-hstore .我在South管理的现有应用中添加了两个类:
class Attribute(models.Model):
name = models.CharField(max_length=200, verbose_name=_("name"))
description = models.CharField(max_length=1000, verbose_name=_("description"))
class Measure(models.Model):
attribute = models.ForeignKey(Attribute)
data = hstore.DictionaryField(db_index=True)
objects = hstore.HStoreManager()
Run Code Online (Sandbox Code Playgroud)
做了一个schemamigration --auto,启动了迁移并得到了一个django.db.utils.DatabaseError: type "hstore" does not exist.
好吧,tuto似乎不完整,django-hstore 文档告诉我使用自定义数据库后端,我将以下内容添加到我的设置文件中:
DATABASES['default']['ENGINE'] = 'django_hstore.postgresql_psycopg2'
Run Code Online (Sandbox Code Playgroud)
后来我有一个KeyError: 'default'在south/db/__init__.py", line 78.此时,intertubes +一些试验/错误将我指向SOUTH_DATABASE_ADAPTERS设置变量,我在设置中添加了以下内容:
SOUTH_DATABASE_ADAPTERS = {'default': 'south.db.postgresql_psycopg2'}
Run Code Online (Sandbox Code Playgroud)
新错误:
File ".../psycopg2/extras.py", line 769, in register_hstore
"hstore type not found in the database. "
psycopg2.ProgrammingError: hstore type not found in the database. …Run Code Online (Sandbox Code Playgroud) 我想保存这样的数据:
User.create(name:"Guy", properties:{url:["url1","url2","url3"], street_address:"asdf"})
我可以在Rails 4中这样做吗?到目前为止,我尝试过迁移:
add_column :users, :properties, :hstore, array: true
但是当我在hstore中保存数组时,它返回错误:
PG::InvalidTextRepresentation: ERROR: array value must start with "{" or dimension information
我遇到一个奇怪的问题,我必须是用户错误,但无法弄明白.
我正在使用Ruby 1.9.3-p194,Rails 4.01,PostgreSQL.
我有一个模型Customer,其中有一个名为data的列,它是一个hstore类型.出于某种原因,我无法使用任何新的键/值更新数据(hstore)列,也无法更新现有键的值.我可以插入并指定任何没有任何问题的键/值.
客户ID:1,first_name:"Mark",last_name:"Test",data:{"balance"=>"0"},created_at:"2013-11-27 14:39:09",updated_at:"2013- 11-27 14:39:09"
c.data["balance"] = "100"
c.save
Run Code Online (Sandbox Code Playgroud)
(0.2ms)BEGIN
(0.3ms)COMMIT => true
如果我执行update_attributes,它会保存它.
c.update_attributes({:data => {"balance" => "343"}})
Run Code Online (Sandbox Code Playgroud)
当我使用c.save时,我没有看到任何错误或异常!.有人有主意吗?
为简单起见,假设我有一个只有一个hstore的列的表.从hstore的所有行获取所有键的unqiue列表的最有效方法是什么?
例如.
my_hstore
------------
a=>1,b=>2
b=>2,c=>3
x=>10,y=>11
y=>11,z=12
Run Code Online (Sandbox Code Playgroud)
检索包含(a,b,c,x,y,z)的列表/数组/集的最有效方法是什么?
我正在尝试查询hstore以查找与搜索条件匹配的某个键的所有值.
我可以获得某个键的所有值,如下所示:
SELECT DISTINCT
svals(slice(data, ARRAY['Supplier']))
FROM "products"
Run Code Online (Sandbox Code Playgroud)
我也可以得到一个特定的价值:
SELECT DISTINCT
svals(slice(data, ARRAY['Supplier'])) AS sup
FROM "products"
WHERE data @> 'Supplier => Toshiba'
Run Code Online (Sandbox Code Playgroud)
我真正喜欢的是(这不起作用):
SELECT DISTINCT
svals(slice(data, ARRAY['Supplier'])) AS sup
FROM "products"
WHERE data @> 'Supplier => %tosh%'
Run Code Online (Sandbox Code Playgroud)
要么:
SELECT DISTINCT
svals(slice(data, ARRAY['Supplier'])) AS sup
FROM "products"
WHERE lower(sup)
LIKE '%tosh%'
Run Code Online (Sandbox Code Playgroud)
用于不区分大小写的搜索.这是怎么做到的?
使用PostgreSQL,第一条记录的表中的列值存储在记录变量中.例如:让变量为:recordvar
recordvar.columnname
Run Code Online (Sandbox Code Playgroud)
给出指定列名的值.我将columname在变量中定义:
var := columnname
Run Code Online (Sandbox Code Playgroud)
在地方columnname,如果我与变量如更换recordvar.var,这是行不通的.
请让我知道如何处理这种情况.以下是示例代码:
CREATE OR REPLACE FUNCTION getrowdata(id numeric, table_name character varying)
RETURNS SETOF void AS
$BODY$
DECLARE
srowdata record;
reqfield character varying;
value numeric;
BEGIN
RAISE NOTICE 'id: %',id;
reqfield:= 'columnname';
EXECUTE 'select * from datas.'||table_name||' WHERE id = '||id into srowdata;
RAISE NOTICE 'srowdata: %',srowdata;
RAISE NOTICE 'srowdatadata.columnname: %',srowdata.columnname;
value:= srowdata.reqfield;
RAISE NOTICE 'value: %',value;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
Run Code Online (Sandbox Code Playgroud) Django 1.8提供了HStoreField,而Django 1.9将为PostgreSQL提供JSONField(它使用jsonb).
我的理解是hstore比json快,但是不允许嵌套并且只允许字符串.
应该何时使用另一个?一个人应该优先于另一个吗?与jsonb相比,hstore仍然是性能的明显赢家吗?