tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

dibi::sqlDump() ?

před 11 lety

knedle
Člen | 34

zdravim,

chci se zeptat, zda existuje v dibi opak k dibi::loadFile(), tj. export SQL do souboru (na disku ci ke stazeni) – pripadne pokud neni primo metoda, tak zda to lze simulovat nejakym jiz vyzkousenym postupem

hledal jsem, patral, ale zadnej uspech

dik za odpoved

knedle

před 11 lety

David Grudl
Nette Core | 6806

Třeba v MySQL můžeš vypsat seznam tabulek:

foreach (dibi::query('SHOW TABLES') as $row) {
    $table = reset($row);
    echo "DROP TABLE IF EXISTS `$table`;\n\n";
    ...
}

Příkaz, který vygeneruje strukturu tabulky, získáš takto:

$row = dibi::fetch('SHOW CREATE TABLE %n', $table);
echo $row['Create Table'], ";\n\n";

Informace o sloupcích zjistíš příkazem:

$columns = dibi::query('SHOW COLUMNS FROM %n', $table)->fetchAssoc('Field');

A nakonec vypisování záznamů:

$connection = dibi::getConnection();

echo "INSERT INTO `$table` VALUES\n";

foreach (dibi::query('SELECT * FROM %n', $table) as $row)
{
    foreach ($row as $field => $value) {
        // tady je potřeba volit escapování podle typu sloupce
        // $column[$field]['Type']
        $row[$field] = $connection->escape($value);
    }
    echo "(", implode(', ', $row), "),\n";
}

Samozřejmě to chce pořešit případy, kdy je tabulka prázdná, nenechávat na konci výpisu znak čárky a hlídat, aby délka SQL příkazu nepřekročila maximální povolenou délku a případně jej rozdělit.

Dibi nic takového přímo neumí, protože generování DUMPu je jiné v každé databázi – implementace by byla dost složitá a přitom podobnou funkci málokdo potřebuje.