如何从 postgres JSONB 列获取值?
How get values from postgres JSONB column?
我有 PostgreSQL 10.5 数据库和 Rails 5 个应用程序。
我的模型:
# == Schema Information
#
# Table name: property_keys
#
# id :integer not null, primary key
# name :string
# created_at :datetime not null
# updated_at :datetime not null
# i18n_name :jsonb
#
class PropertyKey < ApplicationRecord
# Fields
store :i18n_name, accessors: I18n.available_locales, coder: JSON
end
我的迁移:
class LocalizeProperties < ActiveRecord::Migration[5.2]
def up
add_column :property_keys, :i18n_name, :jsonb
PropertyKey.all.each do |property_key|
[:en, :de, :ru].each do |locale_key|
property_key.i18n_name[locale_key] = property_key.name
end
property_key.save!
end
end
def down
remove_column :property_keys, :i18n_name
end
end
Table 姓名:property_keys
。字段列表:
- id: bigint
- i18n_name: jsonb
这里是所有数据的请求:
我想获取所有英文名称(i18n_name
列中 "en"
键的值)。
这是一个请求:
SELECT
id,
i18n_name,
i18n_name->'en' AS en
FROM property_keys;
而且return没什么。
但理论上应该 return 填充 "en" 列的数据。
这是截图:
我也尝试使用 ->>
进行查询,但没有成功:
我应该如何更改我的请求以及我应该使用哪个 PostgreSQL operators 来使其生效?
已检查的 JSONB 列的长度:
你需要the ->>
operator:
SELECT id,
i18n_name,
i18n_name->>'en' AS en
FROM property_keys;
->
和 ->>
运算符按预期工作,通过键或在后一种情况下作为文本检索 json 对象。
我怀疑您遇到的真正问题是,您看到的数据并不是真正存储在 table 中的数据,这就是 i18_name->'en'
无法工作的原因,因为有没有钥匙 en
.
为了能够确认我的写作,请运行在下方查询以查看您在字符串中看到的内容的长度与存储在table 中的内容是否匹配。他们可能不会:
select
length(i18n_name::text) AS stored,
length('{"en":"asdasdadad","de":"asdasdadad","ru":"asdasdadad"}') AS whatisee
你可以用它做什么?使用 bytea
数据类型转换调查数据,或者只是 UPDATE
此列中包含正确(您所看到的)数据的行。
这将使操作员带来您实际期望的结果,因为 jsonb 字段中将有 en
键。
就我而言,在 psql 11 中,->
和 ->>
都适用于 json 和 jsonb 对象。
->
获取带双引号("")的值,->>
获取不带双引号的值。
我有 PostgreSQL 10.5 数据库和 Rails 5 个应用程序。
我的模型:
# == Schema Information
#
# Table name: property_keys
#
# id :integer not null, primary key
# name :string
# created_at :datetime not null
# updated_at :datetime not null
# i18n_name :jsonb
#
class PropertyKey < ApplicationRecord
# Fields
store :i18n_name, accessors: I18n.available_locales, coder: JSON
end
我的迁移:
class LocalizeProperties < ActiveRecord::Migration[5.2]
def up
add_column :property_keys, :i18n_name, :jsonb
PropertyKey.all.each do |property_key|
[:en, :de, :ru].each do |locale_key|
property_key.i18n_name[locale_key] = property_key.name
end
property_key.save!
end
end
def down
remove_column :property_keys, :i18n_name
end
end
Table 姓名:property_keys
。字段列表:
- id: bigint
- i18n_name: jsonb
这里是所有数据的请求:
我想获取所有英文名称(i18n_name
列中 "en"
键的值)。
这是一个请求:
SELECT
id,
i18n_name,
i18n_name->'en' AS en
FROM property_keys;
而且return没什么。
但理论上应该 return 填充 "en" 列的数据。
这是截图:
我也尝试使用 ->>
进行查询,但没有成功:
我应该如何更改我的请求以及我应该使用哪个 PostgreSQL operators 来使其生效?
已检查的 JSONB 列的长度:
你需要the ->>
operator:
SELECT id,
i18n_name,
i18n_name->>'en' AS en
FROM property_keys;
->
和 ->>
运算符按预期工作,通过键或在后一种情况下作为文本检索 json 对象。
我怀疑您遇到的真正问题是,您看到的数据并不是真正存储在 table 中的数据,这就是 i18_name->'en'
无法工作的原因,因为有没有钥匙 en
.
为了能够确认我的写作,请运行在下方查询以查看您在字符串中看到的内容的长度与存储在table 中的内容是否匹配。他们可能不会:
select
length(i18n_name::text) AS stored,
length('{"en":"asdasdadad","de":"asdasdadad","ru":"asdasdadad"}') AS whatisee
你可以用它做什么?使用 bytea
数据类型转换调查数据,或者只是 UPDATE
此列中包含正确(您所看到的)数据的行。
这将使操作员带来您实际期望的结果,因为 jsonb 字段中将有 en
键。
就我而言,在 psql 11 中,->
和 ->>
都适用于 json 和 jsonb 对象。
->
获取带双引号("")的值,->>
获取不带双引号的值。