gpt4 book ai didi

ruby-on-rails - 在Rails <4中为Postgres JSON列设置默认值

转载 作者:行者123 更新时间:2023-12-03 21:16:57 25 4
gpt4 key购买 nike

因此,我现在开始使用Postgres JSON数据类型,即there's a lot of fun stuff you can do with it
在我尚未使用Rails 4的Rails应用程序中(其中support for Postgres JSON has been added),我添加了一个JSON列,如下所示:

create_table :foo do |t|
t.column :bar, :json
end


但我不知道如何为列设置默认值。
我尝试了所有的变体,例如 {}'{}''{}'::json'[]'::json等。但是在迁移运行时出现错误或者它根本不起作用,这意味着迁移在运行,但是当我创建一个新的 Foobarnil

最佳答案

虽然有点晚,但是这对我有用(需要Postgres> = 9.3):

create_table :foo do |t|
t.column :bar, :json
end

execute "ALTER TABLE foo ALTER COLUMN bar SET DEFAULT '[]'::JSON"


编辑:此答案用于提倡 to_json('[]'::text)而不是 '[]'::JSON-感谢 @Offirmo的提示。

旧方法的问题在于,它实际上并未像预期的那样将数组或对象定义为默认值,而是一个看起来像一个的标量(字符串)。为什么这么重要?

Postgres允许将三种类型的值插入JSON列:


对象

INSERT INTO foo (bar) VALUE('{}')
数组

INSERT INTO foo (bar) VALUE('[]')
标量

INSERT INTO foo (bar) VALUE('"string"')


问题是,如果在同一列中混合使用这三种,则将失去使用JSON运算符的能力。如果使用先前提倡的方法将默认值设置为[[]”并查询数组元素,则遇到带有标量默认值的单行将中止整个查询,并出现错误:

=# SELECT * FROM foo WHERE bar->>1 = 'baz';
ERROR: cannot extract element from a scalar

关于ruby-on-rails - 在Rails <4中为Postgres JSON列设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19715282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com