HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Zend Framework 1+PostgreSQL

ある時、Zend Framework 1系+PostgreSQLで組まれたシステムのPostgreSQLバージョンアップを行う機会があったのだけど、PostgreSQL 12以降には上げられないことが判明して、PostgreSQL 11で妥協したことがあった。 CentOS 6のサポート期限も近づいているし、レガシーシステムの面倒を見ているとこういう場面にちょくちょく出くわす。

そこで、各バージョンのZend FrameworkPostgreSQLの組み合わせでの挙動確認を行ってみたメモ・・と思ったが、検証環境の構築を書くのが面倒になったので結論だけ(ぉ。

ちなみに、PostgreSQLについては以下で書いているので参考までに。

hhelibex.hatenablog.jp

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」のことなので、調べてみる。

$ ( 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)
$ ( 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本体は以下からダウンロードする。

また、いろいろと面倒なので、v2の方はZend Skeleton Applicationに頼る。