Zend Framework 1+PostgreSQL
ある時、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に頼る。