php pdo:有可能让DBMS不可知'描述表'吗?

时间:2010-03-10 14:00:10

标签: php pdo database

我有一个脚本解析数据库并创建php类来处理该数据库。 (Zend的-DB-模型发生器)。有没有办法在PHP中有一个DBMS激烈的命令,所以在每种类型的数据库上它将返回表结构?

所以如果我为mysql使用pdo驱动程序一次并且对postgresql使用一次并不重要,它仍将返回表结构。

我现在看到的唯一解决方案是获取数据库类型并打开每个数据库类型并执行相应的命令。

1 个答案:

答案 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用于你项目的那一部分 - 可能比重新发明轮子更快; - )