web-dev-qa-db-fra.com

Les migrations Doctrine2 migrent vers le bas et migrent à partir du navigateur et non de la ligne de commande

J'utilise les migrations Doctrine2. J'ai besoin de réponses à mon doute, je ne trouve pas de bonne solution dans les documentations

J'utilise:

  doctrine migrations:diff // generate migrations files
  doctrine migrations:migrate // migrates up to new version
  1. Comment puis-je migrer vers le bas? la spécification de la version précédente n'a pas fonctionné (rien à mettre à jour indique f.e. doctrine migrations: migrer Version20120211163332 il dit

    Migrating up to Version20120211163332 from 20120309112058
    
    [Doctrine\DBAL\Migrations\MigrationException]  
    Could not find any migrations to execute.      
    

    Mais ce n'est pas en haut ça devrait être en bas! vous pouvez également voir sur les versions en réponse

  2. Si je dois faire une mise à jour DB, est-il possible d'ajouter des requêtes SQL dans les ajouts (modifier certaines données liées à d'autres)? Je n'ai pas encore essayé car le duvet ne fonctionne pas: ((

  3. Existe-t-il un moyen d'utiliser la commande migrate en quelques mots? J'ai sw dans un hébergement partagé sans accès à la console, j'ai donc besoin de cette fonctionnalité, au lieu de copier les requêtes une par une: D dans phpMyAdmin

39
giuseppe

J'ai vu ce document sur le site Web de Symfony: http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html#usage

Il y a doctrine:migrations:execute qui vous permet d'exécuter une seule version de migration vers le haut ou vers le bas manuellement ... mais jamais essayé, désolé.

J'espère que cela t'aides !

Tenez-nous au courant.

26
Aurel

Vous pouvez éventuellement spécifier manuellement la version vers laquelle vous souhaitez migrer:

 php doctrine.php migrations:migrate YYYYMMDDHHMMSS

ou exécuter une migration vers le haut/bas

php doctrine.php migrations:execute YYYYMMDDHHMMSS  --down
php doctrine.php migrations:execute YYYYMMDDHHMMSS  --up

Vous pouvez trouver YYYYMMDDHHMMSS en utilisant:

php doctrine.php migrations:status
>> Current Version:           2012-12-20 23:38:47 (20121220233847)
>> Latest Version:            2012-12-20 23:38:47 (20121220233847)
92
Julio

Voici comment exécuter des migrations à partir du navigateur:

composer.json

{
    "require": {
        "doctrine/dbal": "*",
        "doctrine/migrations": "dev-master"
    },
    "minimum-stability": "dev",
    "autoload": {
        "psr-0": {"": "src/"}
    }
}

src/Acme/Migrations/Version1.php

<?php # src/Acme/Migrations/Version1.php
namespace Acme\Migrations;

use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

/**
 * Class Version1
 *
 * Notice that file and class names MUST be Version*.php
 *
 * @package Acme\Migrations
 */
class Version1 extends AbstractMigration
{
    public function up(Schema $schema)
    {
        $users = $schema->createTable('users');
        $users->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => true));
        $users->addColumn('username', 'string', array('length' => 128));
        $users->addColumn('password', 'string', array('length' => 128));
        $users->setPrimaryKey(array('id'));

        // You can also add any queries
        // $this->addSql('CREATE TABLE addresses (id INT NOT NULL, street VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB');
    }

    public function down(Schema $schema)
    {
        $schema->dropTable('users');

        //$this->addSql('DROP TABLE addresses');
    }

    // Use this functions to prepare your migrations
    //public function preUp(Schema $schema) {}
    //public function postUp(Schema $schema) {}
    //public function preDown(Schema $schema) {}
    //public function postDown(Schema $schema) {}
}

index.php

<?php # index.php
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Migrations\Configuration\Configuration;
use Doctrine\DBAL\Migrations\Migration;
use Doctrine\DBAL\Migrations\OutputWriter;

require_once 'vendor/autoload.php';

$nl = PHP_SAPI == 'cli' ? PHP_EOL : '<br>'; // Optional will be used for output

$to = null; // Optional integer - migrate to version, if null - will migrate to latest available version
#region Optional get argument
$index = PHP_SAPI == 'cli' ? 1 : 'to';
$arguments = PHP_SAPI == 'cli' ? $argv : $_REQUEST;
$to = isset($arguments[$index]) && filter_var($arguments[$index], FILTER_VALIDATE_INT) ? intval($arguments[$index]) : null;
#endregion

#region Doctrine Connection
// Silex: $app['db']
// Symfony controller: $this->get('database_connection')
$db = DriverManager::getConnection(array(
    'dbname' => 'doctine_migrations',
    'user' => 'root',
    'password' => 'root',
    'Host' => 'localhost',
    'driver' => 'pdo_mysql',
    'charset' => 'utf8',
    'driverOptions' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    )
));
#endregion

#region Config
$config = new Configuration($db /*, new OutputWriter(function ($message) { echo $message . PHP_EOL; })*/); // OutputWriter is optional and by default do nothing, accepts closure for writing logs

//$config->setName('My Migrations'); // Optional name for your migrations
$config->setMigrationsTableName('version'); // Table name that will store migrations log (will be created automatically, default name is: doctrine_migration_versions)
$config->setMigrationsNamespace('Acme\\Migrations'); // Namespace of your migration classes, do not forget escape slashes, do not add last slash
$config->setMigrationsDirectory('src/Acme/Migrations'); // Directory where your migrations are located
$config->registerMigrationsFromDirectory($config->getMigrationsDirectory()); // Load your migrations
#endregion

$migration = new Migration($config); // Create Migration based on provided configuration

$versions = $migration->getSql($to); // Retrieve SQL queries that should be run to migrate you schema to $to version, if $to == null - schema will be migrated to latest version

#region Some dummy output
foreach ($versions as $version => $queries) {
    echo 'VERSION: ' . $version . $nl;
    echo '----------------------------------------------' . $nl . $nl;

    foreach ($queries as $query) {
        echo $query . $nl . $nl;
    }

    echo $nl . $nl;
}
#endregion

try {
    $migration->migrate($to); // Execute migration!
    echo 'DONE' . $nl;
} catch (Exception $ex) {
    echo 'ERROR: ' . $ex->getMessage() . $nl;
}

Maintenant vous pouvez:

Exécutez-le à partir de la console:

php index.php - migrera vers la version lates

php index.php 2 - migrera vers la version 2 (si la version actuelle est plus grande - elle migrera vers le bas

Exécutez à partir du navigateur Web:

http://localhost/index.php et http://localhost/index.php?to=2 fera de même.

10
mac

Si vous souhaitez migrer d'une étape vers le bas, vous pouvez utiliser cette syntaxe:

./doctrine migrations:migrate prev

Pour accéder à la première migration:

./doctrine migrations:migrate first

Pour passer à la prochaine migration:

./doctrine migrations:migrate next

Source: https://www.doctrine-project.org/projects/doctrine-migrations/en/1.8/reference/managing_migrations.html#managing-migrations

3
Sergey Zaharchenko