Дамп базы данных с помощью Doctrine 2 - PullRequest
14 голосов
/ 31 января 2012

Можно ли сделать дамп базы данных, используя доктрину 2?Я читал, что у symfony есть библиотека, которая расширяет доктрину, но как я могу использовать ее в своем проекте Zendframework с интеграцией Bisna Doctrine 2?

Ответы [ 6 ]

12 голосов
/ 31 января 2012

Для Symfony2:

Тип

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

в командной строке

7 голосов
/ 16 июля 2012

Doctrine не имеет функции дамп базы данных. Я согласен, что было бы неплохо, но это не является целью ORM.

Вы можете сбросить базу данных, используя

  • скрипт PHP
  • система mysqldump
  • PHPMYADMIN

Вот статья, объясняющая эти решения .

6 голосов
/ 01 марта 2016

Я создал небольшой скрипт, который считывает параметры из app/config/parameters.yml и выводит все данные из базы данных MySQL в файл (с именем текущей даты и времени в качестве имени).

Сохраните это в корне вашего проекта Symfony (например, mysqldump.sh):

#!/bin/bash

# See /84575/poluchit-ishodnyi-katalog-skripta-bash-iz-samogo-skripta#84736
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"

Результат при запуске скрипта:

$ 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
5 голосов
/ 29 мая 2017

Это старый поток, но я просто делал что-то подобное в Symfony и решил разработать для него реальную команду.Это больше похоже на Symfony и дает вам больше контроля над выводом, а также позволяет получить доступ к параметрам, поэтому вам не нужно анализировать Yaml с помощью скрипта 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
        );
    }
}

и AbstractCommand - это просто класс, который расширяет контейнер Symfony 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
{
}
2 голосов
/ 25 июля 2015

Зависит от вашей базы данных. если вы используете mysql, создайте команду php для использования mysqldump

нравится запускать это
mysqldump -u YourUser -p YourDatabaseName > wantedsqlfile.sql

0 голосов
/ 17 декабря 2018

Для более общего подхода к доктрине:

protected function execute(InputInterface $input, OutputInterface $output)
{
    $conn = $this->getDoctrineConnection('default');

    $path = $input->getArgument('filepath');
    if (! is_dir(dirname($path))) {
        $fs = new Filesystem();
        $fs->mkdir(dirname($path));
    }

    $cmd = sprintf('mysqldump -u %s --password=%s %s %s > %s',
        $conn->getUsername(),
        $conn->getPassword(),
        $conn->getDatabase(),
        implode(' ', ['variables', 'config']),
        $path
    );

    exec($cmd, $output, $exit_status);
}
...