我在postgreSQL中使用JSON类型。我可以通过添加:
来解决本地计算机上的could not identify an equality operator for type json
问题
execute <<-SPROC
-- This creates a function named hashjson that transforms the
-- json to texts and generates a hash
CREATE OR REPLACE FUNCTION hashjson(
json
) RETURNS INTEGER LANGUAGE SQL STRICT IMMUTABLE AS $$
SELECT hashtext($1::text);
$$;
-- This creates a function named json_eq that checks equality (as text)
CREATE OR REPLACE FUNCTION json_eq(
json,
json
) RETURNS BOOLEAN LANGUAGE SQL STRICT IMMUTABLE AS $$
SELECT bttextcmp($1::text, $2::text) = 0;
$$;
-- This creates an operator from the equality function
CREATE OPERATOR = (
LEFTARG = json,
RIGHTARG = json,
PROCEDURE = json_eq
);
-- Finaly, this defines a new default JSON operator family with the
-- operators and functions we just defined.
CREATE OPERATOR CLASS json_ops
DEFAULT FOR TYPE json USING hash AS
OPERATOR 1 =,
FUNCTION 1 hashjson(json);
SPROC
但是,我没有Heroku的超级用户权限。我该如何解决这个问题?
更新
我使用JSON存储嵌套哈希,记录如下:
Company
列properties
。属性可以是:
{网站:[{url:1,图片:[1,2,3],说明:1},{网址:2,图片:[1,2,3],说明:2}],维基百科: {url:1,说明:2},脸书:{id:1}}
更新2
错误消息:
PG :: UndefinedFunction:ERROR:无法识别json类型的相等运算符 第1行:SELECT DISTINCT“公司”。*来自“公司”INNER JOIN“评论......
错误指示箭头位于SELECT DISTINCT
。
sql是由视图中的这个部分组成的:
@review.companies
模特:
class Company < ActiveRecord::Base
store_accessor :properties, [:websites, :fb, :twitter, :linkedin,:country, :city, :street, :postcode]
在迁移中:
class AddPropertiesToCompany < ActiveRecord::Migration
def change
add_column :companies, :properties, :json
end
end
再次感谢您的帮助。
答案 0 :(得分:1)
一种解决方案是使用hstore而不是json字段类型。这个问题是将现有的json转换为hstore。
另一种解决方案是在查询中使用GROUP BY而不是SELECT DISTINCT。
但在某些情况下,将字段类型更改为hstore会更容易,例如使用活动管理员时。
我的一个模型中有一个HABTM关联,活跃的管理员会尝试查询:
db_dev=# SELECT DISTINCT "api_v1_test".* FROM "api_v1_test" INNER JOIN "api_v1_test_users" ON "api_v1_test"."id" = "api_v1_test_users"."test_id" WHERE "api_v1_test_users"."user_id" = 200;
ERROR: could not identify an equality operator for type json
LINE 1: SELECT DISTINCT "api_v1_test".* FROM "api_v1_test" INNER JOI...
不想花太多时间修复这个并弄清楚如何重写这些查询我只是将字段转换为hstore,现在一切正常。
另外,你能不能从heroku进入psql控制台来创建你的功能吗?或为他们创建新的迁移?