我有一个脚本解析数据库并创建php类来处理该数据库。 (Zend的-DB-模型发生器)。有没有办法在PHP中有一个DBMS激烈的命令,所以在每种类型的数据库上它将返回表结构?
所以如果我为mysql使用pdo驱动程序一次并且对postgresql使用一次并不重要,它仍将返回表结构。
我现在看到的唯一解决方案是获取数据库类型并打开每个数据库类型并执行相应的命令。
答案 0 :(得分: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",
不是那么容易,似乎^^
并且,在每个类的下方,有一个名为listTableColumns
的方法 - 对于每种数据库类型都不相同...
所以我猜不可能的事情不会像你希望的那么简单......
但是,作为旁注:也许你可以将Doctrine用于你项目的那一部分 - 可能比重新发明轮子更快; - )