php pdo: возможно ли иметь независимую от СУБД таблицу описаний? - PullRequest
0 голосов
/ 10 марта 2010

У меня есть скрипт, который анализирует базу данных и создает классы php для работы с этой базой данных. (Зенд-DB-модель-генератор). есть ли способ в php иметь агонистические команды СУБД, чтобы при каждом типе БД она возвращала структуру таблицы?

, поэтому не имеет значения, если я использую драйвер pdo один раз для mysql и один раз для postgresql, он все равно вернет структуру таблицы.

единственное решение, которое я вижу сейчас, это получить тип БД, включить каждый тип БД и выполнить соответствующую команду.

1 Ответ

1 голос
/ 10 марта 2010

Использование того же SQL-запроса, к сожалению, не представляется возможным, насколько я могу судить ...


О вашей идее прохождения базы данных для извлечения информации о каждой таблице для генерации некоторых классов PHP, это одна из вещей, которую Doctrine (самый известный PHP ORM) делает.

Если вы скачаете его и посмотрите на классы в Doctrine/Import/[DatabaseType].php, вы увидите, что это делается по-разному для каждого вида базы данных.

Например, для MySQL в Doctrine_Import_Mysql используется следующий фрагмент кода:

'listTableFields' => 'DESCRIBE %s',

С другой стороны, для PostgreSQL у вас есть следующее, в Doctrine_Import_Pgsql:

'listTableColumns'     => "SELECT
                            a.attnum,
                            a.attname AS field,
                            t.typname AS type,
                            format_type(a.atttypid, a.atttypmod) AS complete_type,
                            a.attnotnull AS isnotnull,
                            (SELECT 't'
                              FROM pg_index
                              WHERE c.oid = pg_index.indrelid
                              AND a.attnum = ANY (pg_index.indkey)
                              AND pg_index.indisprimary = 't'
                            ) AS pri,
                            (SELECT pg_attrdef.adsrc
                              FROM pg_attrdef
                              WHERE c.oid = pg_attrdef.adrelid
                              AND pg_attrdef.adnum=a.attnum
                            ) AS default
                      FROM pg_attribute a, pg_class c, pg_type t
                      WHERE c.relname = %s
                            AND a.attnum > 0
                            AND a.attrelid = c.oid
                            AND a.atttypid = t.oid
                      ORDER BY a.attnum",

Не все так просто, кажется ^^


Кроме того, ниже каждого класса есть метод с именем listTableColumns, который не одинаков для каждого типа базы данных ...

Так что, к сожалению, все будет не так просто, как вы надеялись ...

Но, как примечание: возможно, вы могли бы использовать Doctrine для этой части вашего проекта - может быть быстрее, чем заново изобретать колесо; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...