Пет*_*нов 2 php arrays postgresql yii2
我是PostgreSQL的新手.当我在托管上应用迁移时,我看到一个错误:
Run Code Online (Sandbox Code Playgroud)SQLSTATE[42883]: Undefined function: 7 ERROR: function array_agg(name) does not exist LINE 12: array_to_string((select array_agg(enumlabel) from pg_enum...
我的托管有PostgreSQL 8.3.11.
正在执行的SQL:
SELECT
d.nspname AS table_schema,
c.relname AS table_name,
a.attname AS column_name,
t.typname AS data_type,
a.attlen AS character_maximum_length,
pg_catalog.col_description(c.oid, a.attnum) AS column_comment,
a.atttypmod AS modifier,
a.attnotnull = false AS is_nullable,
CAST(pg_get_expr(ad.adbin, ad.adrelid) AS varchar) AS column_default,
coalesce(pg_get_expr(ad.adbin, ad.adrelid) ~ 'nextval',false) AS is_autoinc,
array_to_string((select array_agg(enumlabel)
from pg_enum
where enumtypid=a.atttypid)::varchar[],',') as enum_values,
CASE atttypid
WHEN 21 /*int2*/ THEN 16
WHEN 23 /*int4*/ THEN 32
WHEN 20 /*int8*/ THEN 64
WHEN 1700 /*numeric*/ THEN
CASE WHEN atttypmod = -1
THEN null
ELSE ((atttypmod - 4) >> 16) & 65535
END
WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
ELSE null
END AS numeric_precision,
CASE
WHEN atttypid IN (21, 23, 20) THEN 0
WHEN atttypid IN (1700) THEN
CASE
WHEN atttypmod = -1 THEN null
ELSE (atttypmod - 4) & 65535
END
ELSE null
END AS numeric_scale,
CAST(information_schema._pg_char_max_length(information_schema._pg_truetypid(a, t),
information_schema._pg_truetypmod(a, t)) AS numeric) AS size,
a.attnum = any (ct.conkey) as is_pkey
FROM
pg_class c
LEFT JOIN pg_attribute a ON a.attrelid = c.oid
LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
LEFT JOIN pg_type t ON a.atttypid = t.oid
LEFT JOIN pg_namespace d ON d.oid = c.relnamespace
LEFT join pg_constraint ct on ct.conrelid=c.oid and ct.contype='p'
WHERE
a.attnum > 0 and t.typname != ''
and c.relname = 'migration'
and d.nspname = 'public'
ORDER BY
a.attnum;Run Code Online (Sandbox Code Playgroud)
在 .../vendor/yiisoft/yii2/db/Schema.php:628
与评论一样,您最好的选择是更新到Postgres的当前版本.array_agg()Postgres 8.3中没有任何功能.
但是,你可以用一个基本的ARRAY构造函数代替,因为至少Postgres 7.4并且碰巧在这方面更有效,即使在当前的Postgres中也是如此.用您的问题替换查询中的查询的粗体部分:
array_to_string(ARRAY(
SELECT enumlabel FROM pg_enum
WHERE enumtypid = a.atttypid)::text[], ',') AS enum_values,
Run Code Online (Sandbox Code Playgroud)
在Postgres 9.0或更高版本中,您可以简化string_agg():
(SELECT string_agg(enumlabel, ',') FROM pg_enum
WHERE enumtypid = a.atttypid) AS enum_values,
Run Code Online (Sandbox Code Playgroud)
但是,简单的ARRAY构造函数应该仍然更快.
BTW pg_enum本身是在Postgres 8.3(enum类型)中引入的.