2012-01-30 7 views

Odpowiedz

8

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

Oto an article explaining those solutions.

11

Dla Symfony2:

Rodzaj

php app/console doctrine:schema:create --dump-sql 

w wierszu poleceń

+9

Chciałbym zrzucić dane instated struktury. Czy wiesz? – dextervip

+0

Świetna rada! Czy istnieje sposób na zapisanie danych wyjściowych do pliku zamiast drukowania konsoli? – Aerendir

+2

@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

1

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

6

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 
+0

Proszę umieścić to w ogólnym tekście, abyśmy mogli wyciągnąć go za pomocą wget! Znacznie ułatwia życie :) – Fuzzyma

+0

@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'? –

+1

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

3

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 
{ 
} 
+1

$ this-> fs-> dumpFile ($ this-> path, $ result ['output']); –

Powiązane problemy