Pregunta Vaciar datos de la base de datos con Doctrine 2


¿Es posible volcar una base de datos usando la doctrina 2? He leído que Symfony tiene una biblioteca que amplía la doctrina para hacerlo, pero ¿cómo podría usarlo en mi proyecto Zendframework con Bisna Doctrine 2 Integration?


12
2018-01-30 22:19


origen


Respuestas:


Doctrine no tiene ninguna característica de volcado de base de datos. Estoy de acuerdo en que sería bueno, pero tampoco es el objetivo de ORM.

Puedes volcar la base de datos usando

  • un script PHP
  • un sistema mysqldump
  • phpMyAdmin

Aquí está un artículo que explica esas soluciones.


7
2017-07-16 14:30



Para Symfony2:

Tipo

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

en la linea de comando


12
2018-01-31 05:51



Creé un pequeño script que leía los parámetros de app/config/parameters.yml y saca todos los datos de una base de datos MySQL a un archivo (con datetime actual usado como nombre).

Guarde esto en la raíz de su proyecto de Symfony (p. 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"

Resultado al ejecutar el script:

$ 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

6
2018-03-01 13:39



Este es un hilo viejo pero estaba haciendo algo similar en Symfony y decidí desarrollar un comando real para él. Es más una forma de Symfony de hacerlo y le da más control sobre la salida, además de permitirle acceder a los parámetros, para que no tenga que analizar Yaml usando el script 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
        );
    }
}

y AbstractCommand es solo una clase que extiende el ContainerAwareComm de Symfony:

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

4
2018-05-29 05:55



Depende de tu base de datos. si usa mysql, cree un comando php para utilizar mysqldump

como ejecutar esto
mysqldump -u YourUser -p YourDatabaseName > wantedsqlfile.sql


2
2017-07-25 04:07