所以我开始使用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列:
在我的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