加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:47:50 所属栏目:百科 来源:网络整理
导读:所以我开始使用Postgres JSON数据类型,现在是 there’s a lot of fun stuff you can do with it. 在我的Rails应用程序之一还没有Rails 4(其中 support for Postgres JSON has been added)中,我添加了一个JSON列: create_table :foo do |t| t.column :bar,:j
所以我开始使用Postgres JSON数据类型,现在是 there’s a lot of fun stuff you can do with it.
在我的Rails应用程序之一还没有Rails 4(其中 support for Postgres JSON has been added)中,我添加了一个JSON列:
create_table :foo do |t|
  t.column :bar,:json
end

但是我不知道如何设置列的默认值.
我尝试了所有的变体,如{},'{}’,'{}’:: json,'[]’:: json等等,但是我会在迁移运行时收到错误或者它不工作,这意味着迁移运行,但是当我创建一个新的Foo时,bar是零.

解决方法

虽然有点晚,这对我来说(需要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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读