【问题标题】:Rails PostgreSql store multidimensional arrayRails PostgreSql 存储多维数组
【发布时间】:2019-05-20 17:25:13
【问题描述】:

是否可以在一列中存储多维数组。

我已尝试以下操作,并收到以下来自创建记录列的错误。

迁移文件.rb

create_table :balance_sheets_details do |t|
  t.string :headers, array: true, default: []
  t.string :records, array: true, default: [[]]
  t.timestamps
end

引发错误

PG::InvalidTextRepresentation:错误:格式错误的数组文字:“{{}}”

【问题讨论】:

    标签: ruby-on-rails postgresql rails-models


    【解决方案1】:

    来自有关数组的文档(已添加重点):

    CREATE TABLE 的语法允许指定数组的确切大小,例如:

    CREATE TABLE tictactoe (
        squares   integer[3][3]
    );
    

    但是,当前实现忽略任何提供的数组大小限制,即行为与未指定长度的数组相同。

    当前的实现也不强制声明的维数。特定元素类型的数组都被认为是同一类型,无论大小或维数如何。因此,在CREATE TABLE 中声明数组大小或维数只是文档;它不会影响运行时行为。

    因此,实际上并不存在多维数组类型。要解决您的问题,只需将默认值从 {{}} 更改为 {}

    这意味着varchar[][]varchar[] 的类型相同:

    db=# select pg_typeof(a), pg_typeof(b) from (values ('{{hello},{world}}'::varchar[][], '{foo}'::varchar[])) x(a, b);
          pg_typeof      |      pg_typeof
    ---------------------+---------------------
     character varying[] | character varying[]
    (1 row)
    

    不过,您仍然可以存储多维数据。

    一维数组和二维数组不一样:

    db=# select '{{foo}}'::varchar[] = '{foo}'::varchar[];
     ?column?
    ----------
     f
    (1 row)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2013-06-21
      • 2012-04-01
      • 1970-01-01
      相关资源
      最近更新 更多