PostgreSQL"的Heroku错误无法识别类型为json"的相等运算符。

时间:2014-03-23 06:35:36

标签: ruby-on-rails json postgresql heroku root

我在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存储嵌套哈希,记录如下: Companyproperties。属性可以是:

  

{网站:[{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

再次感谢您的帮助。

1 个答案:

答案 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控制台来创建你的功能吗?或为他们创建新的迁移?