ある時、Zend Framework 1系+PostgreSQLで組まれたシステムのPostgreSQLバージョンアップを行う機会があったのだけど、PostgreSQL 12以降には上げられないことが判明して、PostgreSQL 11で妥協したことがあった。 CentOS 6のサポート期限も近づいているし、レガシーシステムの面倒を見ているとこういう場面にちょくちょく出くわす。
そこで、各バージョンのZend FrameworkとPostgreSQLの組み合わせでの挙動確認を行ってみたメモ・・と思ったが、検証環境の構築を書くのが面倒になったので結論だけ(ぉ。
ちなみに、PostgreSQLについては以下で書いているので参考までに。
Zend Framework 1からPostgreSQL 12以上に接続すると以下のようなエラーが発生する。
exception 'PDOException' with message 'SQLSTATE[42703]: Undefined column: 7 ERROR: 列d.adsrcは存在しません
LINE 9: d.adsrc AS default_value,
^' in /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Statement/Pdo.php:228
Stack trace:
#0 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array)
#1 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array)
#2 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#3 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT\n ...', Array)
#4 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Adapter/Pdo/Pgsql.php(177): Zend_Db_Adapter_Pdo_Abstract->query('SELECT\n ...')
#5 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(836): Zend_Db_Adapter_Pdo_Pgsql->describeTable('hoge', NULL)
#6 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(875): Zend_Db_Table_Abstract->_setupMetadata()
#7 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(983): Zend_Db_Table_Abstract->_setupPrimaryKey()
#8 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Select.php(100): Zend_Db_Table_Abstract->info()
#9 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Select.php(78): Zend_Db_Table_Select->setTable(Object(Model_Hoge))
#10 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(1019): Zend_Db_Table_Select->__construct(Object(Model_Hoge))
#11 /var/www/html/test/2020-1018-01/v1-1/Application/controllers/IndexController.php(15): Zend_Db_Table_Abstract->select()
#12 /var/www/html/test/2020-1018-01/v1-1/Zend/Controller/Action.php(516): IndexController->indexAction()
#13 /var/www/html/test/2020-1018-01/v1-1/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('indexAction')
#14 /var/www/html/test/2020-1018-01/v1-1/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#15 /var/www/html/test/2020-1018-01/v1-1/index.php(7): Zend_Controller_Front->dispatch()
#16 {main}
Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[42703]: Undefined column: 7 ERROR: 列d.adsrcは存在しません
LINE 9: d.adsrc AS default_value,
^, query was: SELECT
a.attnum,
n.nspname,
c.relname,
a.attname AS colname,
t.typname AS type,
a.atttypmod,
FORMAT_TYPE(a.atttypid, a.atttypmod) AS complete_type,
d.adsrc AS default_value,
a.attnotnull AS notnull,
a.attlen AS length,
co.contype,
ARRAY_TO_STRING(co.conkey, ',') AS conkey
FROM pg_attribute AS a
JOIN pg_class AS c ON a.attrelid = c.oid
JOIN pg_namespace AS n ON c.relnamespace = n.oid
JOIN pg_type AS t ON a.atttypid = t.oid
LEFT OUTER JOIN pg_constraint AS co ON (co.conrelid = c.oid
AND a.attnum = ANY(co.conkey) AND co.contype = 'p')
LEFT OUTER JOIN pg_attrdef AS d ON d.adrelid = c.oid AND d.adnum = a.attnum
WHERE a.attnum > 0 AND c.relname = 'hoge' ORDER BY a.attnum' in /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Statement/Pdo.php:235
Stack trace:
#0 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array)
#1 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#2 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT\n ...', Array)
#3 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Adapter/Pdo/Pgsql.php(177): Zend_Db_Adapter_Pdo_Abstract->query('SELECT\n ...')
#4 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(836): Zend_Db_Adapter_Pdo_Pgsql->describeTable('hoge', NULL)
#5 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(875): Zend_Db_Table_Abstract->_setupMetadata()
#6 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(983): Zend_Db_Table_Abstract->_setupPrimaryKey()
#7 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Select.php(100): Zend_Db_Table_Abstract->info()
#8 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Select.php(78): Zend_Db_Table_Select->setTable(Object(Model_Hoge))
#9 /var/www/html/test/2020-1018-01/v1-1/Zend/Db/Table/Abstract.php(1019): Zend_Db_Table_Select->__construct(Object(Model_Hoge))
#10 /var/www/html/test/2020-1018-01/v1-1/Application/controllers/IndexController.php(15): Zend_Db_Table_Abstract->select()
#11 /var/www/html/test/2020-1018-01/v1-1/Zend/Controller/Action.php(516): IndexController->indexAction()
#12 /var/www/html/test/2020-1018-01/v1-1/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('indexAction')
#13 /var/www/html/test/2020-1018-01/v1-1/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#14 /var/www/html/test/2020-1018-01/v1-1/index.php(7): Zend_Controller_Front->dispatch()
#15 {main}
ここで出てくる「d.adsrc」とは「pg_attrdef.adsrc」のことなので、調べてみる。
- PostgreSQL 10/11
$ ( v=11 ; /usr/pgsql-${v}/bin/psql -U postgres -p $((5432+v)) -c '\d pg_attrdef' )
テーブル "pg_catalog.pg_attrdef"
列 | 型 | 照合順序 | Null 値を許容 | デフォルト
---------+--------------+----------+---------------+------------
adrelid | oid | | not null |
adnum | smallint | | not null |
adbin | pg_node_tree | | |
adsrc | text | | |
インデックス:
"pg_attrdef_adrelid_adnum_index" UNIQUE, btree (adrelid, adnum)
"pg_attrdef_oid_index" UNIQUE, btree (oid)
- PostgreSQL 12/13
$ ( v=12 ; /usr/pgsql-${v}/bin/psql -U postgres -p $((5432+v)) -c '\d pg_attrdef' )
テーブル"pg_catalog.pg_attrdef"
列 | 型 | 照合順序 | Null 値を許容 | デフォルト
---------+--------------+----------+---------------+------------
oid | oid | | not null |
adrelid | oid | | not null |
adnum | smallint | | not null |
adbin | pg_node_tree | C | not null |
インデックス:
"pg_attrdef_adrelid_adnum_index" UNIQUE, btree (adrelid, adnum)
"pg_attrdef_oid_index" UNIQUE, btree (oid)
確かに「adsrc」カラムがv12から無くなっている。
ちなみに、Zend Framework 2ではPostgreSQL 13まで問題なく動作した。
実際に確かめてみたいという方は、以下のリソースをダウンロードしてごにょごにょすれば(いい加減)。
Zend Framework本体は以下からダウンロードする。
- Archives - Install - Zend Framework
また、いろいろと面倒なので、v2の方はZend Skeleton Applicationに頼る。