php pdo:有一个DBMS不可知论者是可能的';描述表';?

php pdo:有一个DBMS不可知论者是可能的';描述表';?,php,pdo,database,Php,Pdo,Database,我有一个脚本,可以解析数据库并创建php类来处理该数据库。(zend db模型生成器)。有没有一种方法可以在php中使用DBMS命令,以便在每种类型的数据库上返回表结构 因此,不管我对mysql和postgresql使用一次pdo驱动程序,它仍然会返回表结构 目前我看到的唯一解决方案是获取db类型并打开每个db类型并执行相应的命令。不幸的是,就我所知,使用相同的SQL查询似乎不太可能 关于通过数据库提取每个表的信息以生成一些PHP类的想法,这是(最著名的PHP ORM)所做的事情之一 如果您下

我有一个脚本,可以解析数据库并创建php类来处理该数据库。(zend db模型生成器)。有没有一种方法可以在php中使用DBMS命令,以便在每种类型的数据库上返回表结构

因此,不管我对mysql和postgresql使用一次pdo驱动程序,它仍然会返回表结构


目前我看到的唯一解决方案是获取db类型并打开每个db类型并执行相应的命令。

不幸的是,就我所知,使用相同的SQL查询似乎不太可能


关于通过数据库提取每个表的信息以生成一些PHP类的想法,这是(最著名的PHP ORM)所做的事情之一

如果您下载它,并查看
doctor/Import/[DatabaseType].php中的类,您会发现这对于每种数据库都是不同的

例如,对于MySQL,以下代码段用于
doctor\u Import\u MySQL

'listTableFields' => 'DESCRIBE %s',
'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",
另一方面,对于PostgreSQL,在
原则\u Import\u Pgsql
中有以下内容:

'listTableFields' => 'DESCRIBE %s',
'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
的方法——对于每种数据库类型来说,它是不同的

所以我猜事情不会像你希望的那么简单


但是,作为旁注:也许你可以在项目的这一部分使用条令——可能比重新发明轮子更快;-)

嗨。谢谢你的更新。我有我自己的项目叫做zend db model generator,它在谷歌代码上。想改进一下吗?好的,关于你自己的项目:-);;玩得高兴