- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为名为 data
的列使用 jsonb
数据类型。当我使用简单的哈希查询时,它可以正常工作:
[1] pry(PredictionService)> Prediction.where(data: {"innings_no" => 1})
Prediction Load (1.2ms) SELECT "predictions".* FROM "predictions" WHERE "data"."innings_no" = 1
=> #<Prediction::ActiveRecord_Relation:0x3fcb34634e78>
当我使用这样的数组时,它因不正确的 SQL 而失败:
[2] pry(PredictionService)> Prediction.where(data: {"innings_no" => [1,2]})
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "data" does not exist
LINE 5: WHERE a.attrelid = '"data"'::regclass
^
: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"data"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
from /Users/lenin.rajasekaran/.rvm/gems/ruby-2.3.1@duggout-app/gems/activerecord-4.2.5/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec'
这是 jsonb/ActiveRecord 的已知问题还是可以修复?
我无法使用 Postgres 的数组函数来访问特定键,因为键是动态的,我正在使用此查询在创建新记录之前查找现有记录。
最佳答案
因此,您有一个名为 data
的 jsonb
列,其中包含类似
{ "innings_no": 6, ... }
要在查询中使用该列,您必须使用 PostgreSQL JSON functions and operators .在这种情况下,您可能需要 ->>
,它将字段提取为 text
值和类型转换。所以像这样:
Prediction.where("(data ->> 'innings_no')::int = ?", 1)
data ->> 'innings_no'
或多或少等同于 Ruby(或 JavaScript)中的 data['innings_no']
,::int
将 ->>>
产生的字符串转换为整数。
当然,在一个小 SQL 片段中使用 =
意味着您负责修改查询以说明数组:
Prediction.where("(data ->> 'innings_no')::int = any(array[?])", [1,2])
或:
Prediction.where("(data ->> 'innings_no')::int in (?)", [1,2])
幸运的是,= any
和 in
版本在任何一种情况下都可以工作,因此您可以这样做而不必担心
innings = 1
Prediction.where("(data ->> 'innings_no')::int = any(array[?])", innings)
innings = [1,2]
Prediction.where("(data ->> 'innings_no')::int = any(array[?])", innings)
另一方面,如果您有一个 Ruby 哈希,您想要查找其 data
与该哈希重叠的模型,那么您可以使用 @>
运算符:
@> jsonb
Does the left JSON value contain the right JSON path/value entries at the top level?
'{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb
和 to_json
调用以构建右侧。例如:
hash = { :innings_no => 1, :pancakes => 11 }
Prediction.where('data @> ?', hash.to_json)
PostgreSQL 会自动将 ?
字符串转换为 JSONB,但您可以明确地说:
Prediction.where('data @> ?::jsonb', hash.to_json)
# -------------------------^^^^^^^
您的第一个查询:
Prediction.where(data: {"innings_no" => 1})
不起作用,因为 ActiveRecord 保留了引用 JOINed 表的参数结构,正如您在 SQL 中看到的那样:
WHERE "data"."innings_no" = 1
table -^^^^
column -------^^^^^^^^^^
所以当它最终出现在数据库中时,PostgreSQL 将寻找一个名为 data
的表,但找不到。当然,这不会失败,直到它到达该数据库,所以它在 pry
中看起来很好。
您的第二个查询:
Prediction.where(data: {"innings_no" => [1,2]})
因同样的原因而失败,但它失败得更早,因为出于某种原因,[1,2]
数组使 ActiveRecord 想知道 data
表的结构当它试图构建查询时; pg_attribute
和 pg_attrdef
系统表上的奇怪查询是 ActiveRecord 用来确定表结构的,所以任何时候你看到这样的查询都是 ActiveRecord 尝试找出表的列结构。
关于ruby-on-rails - ActiveRecord 在将 JSONB/Hash 与 Array 一起使用时构造不正确的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39824373/
我有一个 Postgres 表,mytable 其中一个字段如下: myField JSONB[] NOT NULL 让我们假设上述 json 是这种形式: { "字母":"A", "数字":30}
在 PostgreSQL 的一个 jsonb 字段中保存多个地址是个好主意。我是 nosql 的新手,我想测试 PostgreSQL 来做到这一点。我不想有另一个包含地址的表,我更喜欢将它放在同一个表
我得到了带有 jsonb 的字段 tags: [{"value": "tag1"}] 我需要做这样的事情 update table1 set tags = tags - '{"value": "tag
我使用 postgres9.4,并且存在关系“Patients”具有类型为 jsonb[] 的列“contact”,如何传输类型 jsonb[ ] 到 jsonb? 记录如下。 =>select na
我正在尝试使用以下查询基于 jsonb 字段中的多个 json 属性将 jsonb 字段更新到表中 insert into testtable(data) values('{ "key": "
我有列 options 类型为 jsonb ,格式为 {"names": ["name1", "name2"]} 是用 创建的 UPDATE table1 t1 SET options = (SELE
我在其中一个项目中使用 Postgres 数据库。现在我需要将 JSON 数组存储在数据库中。如下所示: 例如,我有以下 JSON 结构: [ { "Id": 1, "Name":
我正在尝试从 postgre 表中读取一个 jsonb 字段。我尝试通过以下方式使用 Jsonb 库将其作为 Jsonb 类型读取: @Entity @Table(name = "test") dat
tl;dr -- 有什么方法可以从 postgres 中的 jsonb 对象获取值作为 jsonb_array 吗? 尝试在 postgres 中使用递归 cte 来展平任意深度的树结构,如下所示:
给定类似于以下的现有数据结构: CREATE TEMP TABLE sample (id int, metadata_array jsonb, text_id_one jsonb, text_id_t
psql --version psql (PostgreSQL) 9.4.1 rails -v Rails 4.2.0 我通过这样的迁移添加了一个 jsonb 列 class AddPreferenc
假设我有一个模型 Neighborhood,它有一个 jsonb[] 字段 families,它是一个包含 json 对象的数组,具有任何类型的键值对,如下所示 [{"name":"Smiths",
我在这里显示了以下数据集 http://sqlfiddle.com/#!17/f9280/1 我想查询数据的方式是每个键和类别的平均排名 例如, 键 1,类别 10,avg_rank:95 键 1,类
我在 springboot(2.1)+postgres(10.5)+hibernate(5.3.7) 中使用 jsonb。 以下是文件中的更改: 在 pom.xml 中 .... com.vladm
考虑像下面这样的模型和一个 bars 的 json 数组: const myModel = { id: 1, bars: [ { aproperty: 10 },
friend 们好,我需要帮助来解决以下问题, 我在我的 postgres 数据库表中有一组记录,其中表有 JSONB 类型字段。 JSONB 类型列包含以下JSON, 记录#1 :- { "ke
我有一个表,其中 JSONB 列存储 JSONB 数组/字符串(下例中的 value_r 列)。仅对 JSONB 列中的 JSONB 数组的内容进行排序(还存储字符串)的最简单(且有效)的方法是什么?
在 PostgreSQL 9.5 表中,我有一个 integer 列 social。 当我尝试在存储过程中更新它时,在jsonb 类型的 in_users 变量中给定以下 JSON 数据(一个包含 2
我有一个专栏amount_splits我需要按照我指定的键顺序保存我的 JSON。 如何防止 Rails/Postgres jsonb当我将它保存到数据库时自动排序我的 JSON 键? (用于创建或更
我想使用 UNION ALL 运算符将 2 个表合并为一个表。第一个表有几个字段。第二个表将几个字段分组到 JSONB 字段上。 为了简化问题,我使用这个简单的 SQL 请求(不依赖于表)重现了错误:
我是一名优秀的程序员,十分优秀!