2010-03-10 2 views
0

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

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

Единственным решением, которое я вижу сейчас, является получение типа db и включение каждого типа db и выполнение соответствующей команды.

ответ

1

Используя тот же запрос 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", 

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


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

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

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

+0

привет. Спасибо за обновление. У меня есть собственный проект под названием zend-db-model-generator, он находится в коде google. хочу немного улучшить его. – ufk

+0

OK о наличии собственного проекта :-) ;; Повеселись ! –

Смежные вопросы