Migración de Doctrine2 usando DBAL en lugar de $ this-> addSql

Así que he hecho un montón de migraciones de Doctrine2 (https://github.com/doctrine/migrations) pero tengo una pregunta para una nueva migración que estoy tratando de hacer.

He estado cavando un poco en la biblioteca y veo que$this->addSql() se utiliza para construir una lista de SQL para ejecutar y luego se ejecuta más tarde.

Quería hacer algo donde seleccionaba algunos datos, iteraba sobre las filas, insertaba nuevos datos basados ​​en eso y luego borraba los datos que seleccioné. Esto se presta a la biblioteca DBAL con bastante facilidad, pero me pregunto si puedo usar elprotected $connection en una migración segura? ¿O es tan malo porque ejecutaría sentencias antes que cualquiera de mis$this->addSql() SQL se ejecuta? También parece que esto rompería eldry-run Configuración de lo que he visto en el código. ¿Alguien ha tenido alguna experiencia con este tipo de migración? ¿Existen buenas prácticas?

Lo siguiente es la migración que quiero hacer, pero no estoy seguro de que Doctrine Migrations lo admita:

<code>public function up(Schema $schema)
{
    // this up() migration is autogenerated, please modify it to your needs
    $this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql");

    $this->addSql("ALTER TABLE article_enclosures ADD is_scrape TINYINT(1) NOT NULL");
    $this->addSql("ALTER TABLE images DROP FOREIGN KEY FK_E01FBE6AA536AAC7");

    // now lets take all images with a scrape and convert the scrape to an enclosure
    // 
    // Select all images where not scrape_id is null (join on article_image_scrape)
    // for each image:
    //     insert into article_enclosures
    //     update image set enclosure_id = new ID
    //     delete from article_image_scrape where id...
    //
    // insert into article_enclosures select article_image_scrapes...

    $sql = "SELECT i.id img_id, e.* FROM images i JOIN article_image_scrapes e ON i.scrape_id = e.id";
    $stmt = $this->connection->prepare($sql);
    $stmt->execute();
    $scrapesToDelete = array();
    while ($row = $stmt->fetch()) {
        $scrapeArticle = $row['article_id'];
        $scrapeOldId = $row['id'];
        $scrapeUrl = $row['url'];
        $scrapeExtension = $row['extension'];
        $scrapeUrlHash = $row['url_hash'];
        $imageId = $row['image_id'];

        $this->connection->insert('article_enclosures', array(
            'url' => $scrapeUrl,
            'extension' => $scrapeExtension,
            'url_hash' => $scrapeUrlHash
        ));

        $scrapeNewId = $this->connection->lastInsertId();

        $this->connection->update('images', array(
            'enclosure_id' => $scrapeNewId,
            'scrape_id' => null
        ), array(
            'id' => $imageId
        ));

        $scrapesToDelete[] = $scrapeOldId;
    }

    foreach ($scrapesToDelete as $id) {
        $this->connection->delete('article_image_scrapes', array('id' => $id));
    }

    $this->addSql("INSERT INTO article_scrapes (article_id, url, extension, url_hash) "
            ."SELECT s.id, s.url, s.extension, s.url_hash"
            ."FROM article_image_scrapes s");

    $this->addSql("DROP INDEX IDX_E01FBE6AA536AAC7 ON images");
    $this->addSql("ALTER TABLE images DROP scrape_id, CHANGE enclosure_id enclosure_id INT NOT NULL");
}
</code>

Respuestas a la pregunta(2)

Su respuesta a la pregunta