Czy można zrzucić bazę danych za pomocą doktryny 2? Czytałem, że symfony ma bibliotekę, która rozszerza doktrynę, aby to zrobić, ale jak mogę jej użyć w moim projekcie zendframework z Bisna Doctrine 2 Integration?Zrzuć dane bazy danych za pomocą Doctrine 2
Odpowiedz
Doctrine ma funkcję bazy danych zrzutu. Zgadzam się, że byłoby miło, ale nie jest to również celem ORM.
Można zrzucić bazy danych za pomocą
- skrypt PHP
- system mysqldump
- phpMyAdmin
Dla Symfony2:
Rodzaj
php app/console doctrine:schema:create --dump-sql
w wierszu poleceń
W zależności od bazy danych. jeśli używasz MySQL, utworzyć polecenie php do wykorzystania mysqldump
jak działa ten
mysqldump -u YourUser -p YourDatabaseName > wantedsqlfile.sql
stworzyłem mały skrypt, który odczytać parametry z app/config/parameters.yml
i wyjście wszystkich danych z bazy danych MySQL do pliku (z bieżącą datą używaną jako nazwa).
Zapisz to w katalogu głównym projektu Symfony (np mysqldump.sh
):
#!/bin/bash
# See http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in/23905052#23905052
ROOT=$(readlink -f $(dirname "$0"))
cd $ROOT
# Get database parameters
dbname=$(grep "database_name" ./app/config/parameters.yml | cut -d " " -f 6)
dbuser=$(grep "database_user" ./app/config/parameters.yml | cut -d " " -f 6)
dbpassword=$(grep "database_password" ./app/config/parameters.yml | cut -d " " -f 6)
filename="$(date '+%Y-%m-%d_%H-%M-%S').sql"
echo "Export $dbname database"
mysqldump -B "$dbname" -u "$dbuser" --password="$dbpassword" > "$filename"
echo "Output file :"
ls -lh "$filename"
Wynik po uruchomieniu skryptu:
$ bash mysqldump.sh
Export […] database
Warning: Using a password on the command line interface can be insecure.
Output file :
-rw-rw-r-- 1 […] […] 1,8M march 1 14:39 2016-03-01_14-39-08.sql
Proszę umieścić to w ogólnym tekście, abyśmy mogli wyciągnąć go za pomocą wget! Znacznie ułatwia życie :) – Fuzzyma
@Fuzzyma tutaj jest [gist] (https://gist.github.com/alexislefebvre/0b2d93b2c78a064b49a6c912deff5ab8). Jak tego używasz? Pobierając go i wykonując go bezpośrednio? Podobnie jak 'wget https://gist.githubusercontent.com/alexislefebvre/0b2d93b2c78a064b49a6c912deff5ab8/raw/3da6188de911c25b1d3e6c3b3146e864c220d595/symfony_mysqldump.sh; bash./ symfony_mysqldump.sh'? –
jep - to jest moja intencja. Chcę użyć funkcji wgets bezpośrednio uruchomić sript po downloding: 'wget -O - http://foo.bar/pathToScript.sh | bash' – Fuzzyma
Jest to stary wątek, ale ja po prostu robi coś podobnego w Symfony i postanowił opracować dla niego rzeczywistą komendę. To raczej sposób Symfony prowadzenia go i daje większą kontrolę na wyjściu, a także pozwala uzyskać dostęp do parametrów, dzięki czemu nie trzeba analizować yaml użyciu skryptu bash :)
namespace Fancy\Command;
use Fancy\Command\AbstractCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
class DatabaseDumpCommand extends AbstractCommand
{
/** @var OutputInterface */
private $output;
/** @var InputInterface */
private $input;
private $database;
private $username;
private $password;
private $path;
/** filesystem utility */
private $fs;
protected function configure()
{
$this->setName('fancy-pants:database:dump')
->setDescription('Dump database.')
->addArgument('file', InputArgument::REQUIRED, 'Absolute path for the file you need to dump database to.');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int|null|void
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->output = $output;
$this->database = $this->getContainer()->getParameter('database_name') ;
$this->username = $this->getContainer()->getParameter('database_user') ;
$this->password = $this->getContainer()->getParameter('database_password') ;
$this->path = $input->getArgument('file') ;
$this->fs = new Filesystem() ;
$this->output->writeln(sprintf('<comment>Dumping <fg=green>%s</fg=green> to <fg=green>%s</fg=green> </comment>', $this->database, $this->path));
$this->createDirectoryIfRequired();
$this->dumpDatabase();
$output->writeln('<comment>All done.</comment>');
}
private function createDirectoryIfRequired() {
if (! $this->fs->exists($this->path)){
$this->fs->mkdir(dirname($this->path));
}
}
private function dumpDatabase()
{
$cmd = sprintf('mysqldump -B %s -u %s --password=%s' // > %s'
, $this->database
, $this->username
, $this->password
);
$result = $this->runCommand($cmd);
if($result['exit_status'] > 0) {
throw new \Exception('Could not dump database: ' . var_export($result['output'], true));
}
$this->fs->dumpFile($this->path, $result);
}
/**
* Runs a system command, returns the output, what more do you NEED?
*
* @param $command
* @param $streamOutput
* @param $outputInterface mixed
* @return array
*/
protected function runCommand($command)
{
$command .=" >&1";
exec($command, $output, $exit_status);
return array(
"output" => $output
, "exit_status" => $exit_status
);
}
}
i AbstractCommand to tylko klasa, która przedłuża symfony's ContainerAwareCommand:
namespace Fancy\Command;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
abstract class AbstractCommand extends ContainerAwareCommand
{
}
$ this-> fs-> dumpFile ($ this-> path, $ result ['output']); –
Chciałbym zrzucić dane instated struktury. Czy wiesz? – dextervip
Świetna rada! Czy istnieje sposób na zapisanie danych wyjściowych do pliku zamiast drukowania konsoli? – Aerendir
@Aerendir 'php app/console doctrine: schema: create --dump-sql> dump.sql' umieszcza kod w pliku" dump.sql ". które następnie można skompresować za pomocą 'gzip dump.sql', jeśli chcesz. – JamesWilson