2012-03-09 7 views
29

Używam migracji Doctrine2. Potrzebuję odpowiedzi na temat mojej wątpliwości, ja canno znaleźć dobre rozwiązanie w dokumentacjiMigracje Doctrine2 migrują i migrują z przeglądarki, a nie z wiersza poleceń

używam:

doctrine migrations:diff // generate migrations files 
    doctrine migrations:migrate // migrates up to new version 
  1. Jak mogę migrować w dół? określając poprzednia wersja nie działa (nic go zaktualizować mówi fe migracje nauką! migrować Version20120211163332 mówi

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

    Ale to nie zależy powinno być w dół można zobaczyć również w wersjach w odpowiedzi

  2. Jeśli muszę dokonać aktualizacji DB, czy jest możliwe dodanie zapytań SQL w dodatkach (zmiana niektórych danych związanych z innymi)? Nie próbowałem jeszcze, ponieważ nie działa: ((

  3. Czy są jakieś sposób używać polecenia migrate w skrócie przeglądarki? Mam sw wspólnego hostingu z na dostęp do konsoli, więc trzeba tę funkcję, zamiast kopiowania pyta jeden po drugim: D w phpMyAdmin

Odpowiedz

20

Widziałem ten dokument na stronie symfony: http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html#usage

Jest doctrine:migrations:execute, który pozwala na wykonanie pojedynczego wersja migracyjna w górę lub w dół ręcznie ... ale nigdy nie próbowałem, przepraszam.

Mam nadzieję, że to pomoże!

Wysyłajcie nam wiadomości.

+1

Dzięki za odpowiedź, zachowałem twoją akceptowaną odpowiedź, przynajmniej próbowaliście !! Tak Czytałem dokumentację (również przed napisaniem pytania). Jeśli idziesz w górę, nie ma problemu, ale w dół jest koszmar. Należy także pamiętać, że jeśli pracują w zespole z subversioning najlepiej ignorować folderu migracji i by polecenie migrować za każdym razem odświeżania kopii roboczej jest wykonany – giuseppe

+1

użytku „doktryny: Migracje: najnowsze”, aby uzyskać najnowsze wersja, przed poleceniem "execute --down". Sprawia, że ​​rzeczy trochę łatwiejsze. – targnation

69

Opcjonalnie można ręcznie określić wersję chcesz migrować do:

php5 doctrine.php migrations:migrate YYYYMMDDHHMMSS 

lub wykonać migrację w górę/w dół

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

można znaleźć rrrrmmddggmmss używając:

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

To jest na miejscu. Nie jest to trudne, jak sugerują inni, najtrudniej jest skopiować datownik z nazwy pliku! Dla tych, którzy używają symfony, po prostu wywołaj doktrynę app/console: migrations: wykonaj YYYYMMDDHHMMSS --down –

7

Oto, jak można uruchomić migracje z przeglądarki:

composer.json

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

src/Acme/migracje/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) {} 
} 

indeksu.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; 
} 

Teraz możesz:

go uruchomić z konsoli:

php index.php - będą migrować do wersji legislacja

php index.php 2 - będą migrować do wersji 2 (jeśli obecna wersja jest większa - będzie migrować w dół

Uruchom z przeglądarki internetowej:

http://localhost/index.php i http://localhost/index.php?to=2 zrobi to samo.