Oznámení
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.