PHP PDO: o agnostik bir DBMS 'Tabloyu açıklamak' için possbile It?

1 Cevap php

Ben veritabanı ayrıştırmak ve bu db ile çalışmak için php sınıfları oluşturmak bir komut dosyası var. (Zend-db-modeli-jeneratör). Bu tablo yapısını dönecektir db her türüne yani komutları agonstic bir DBMS için php için bir yolu var mı?

MySQL kez PDO sürücüsünü kullanmak ve bir kez PostgreSQL için, hala tablo yapısını dönecektir eğer bu yüzden önemli değil.

ben şimdi görmek tek çözüm db türü almak ve her db tipine geçiş ve uygun komutu çalıştırmaktır.

1 Cevap

Aynı SQL sorgusunu kullanarak, ne yazık ki, bildiğim kadarıyla söyleyebilirim, pek mümkün görünmüyor ...


About your idea of going through the database to extract informations about each table to generate some PHP classes, that's one of the things that Doctrine (the most famous PHP ORM) does.

Bunu indirebilir ve Doctrine/Import/[DatabaseType].php sınıfların bir göz atacak olursak, bu veritabanı her tür için farklı yapılır göreceksiniz.

Örneğin, MySQL için, aşağıdaki kod parçası kullanılır Doctrine_Import_Mysql:

'listTableFields' => 'DESCRIBE %s',

Öte yandan, PostgreSQL için, size aşağıdaki var içinde Doctrine_Import_Pgsql ettik:

'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",

O kadar kolay değil, bu ^ ^ görünüyor


And, farther down each class, there is a method called listTableColumns -- which is not the same for each database type...

Yani bir şeyler tahmin ediyorum, ne yazık ki, size umut kadar basit olmayacak ...

Ama, bir dipnot düşmek gibi: belki size proje bu bölümü için Doktrini kullanabilirsiniz - tekerleği yeniden icat ;-) daha hızlı olabilir