学说迁移错误 - "relation does not exist"

Doctrine Migration Error - "relation does not exist"

你如何创建 sql 触发器与学说迁移?

这里是迁移:

<?php
namespace App\Migrations;

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

/**
 * Auto-generated Migration: Please modify to your needs!
 */
class Version20151211173441 extends AbstractMigration
{
    /**
     * @param Schema $schema
     */
    public function up(Schema $schema)
    {
        $table = $schema->createTable('public.users');
        $table->addColumn('id', 'integer', [
            'autoincrement' => true
        ]);
        $table->addColumn('name', 'string');
        $table->setPrimaryKey(['id']);

        $this->addSql("
            CREATE OR REPLACE FUNCTION public.users_insert_trigger()
                RETURNS TRIGGER AS $$
                BEGIN
                    NEW.name := NEW.name || ' test';
                    RETURN NEW;
                END;
                $$
                LANGUAGE plpgsql;
        ");

        $this->addSql("
            CREATE TRIGGER users_on_insert_trigger
                BEFORE INSERT ON public.users
                FOR EACH ROW EXECUTE PROCEDURE public.users_insert_trigger();
        ");
    }

    /**
     * @param Schema $schema
     */
    public function down(Schema $schema)
    {
        $this->addSql("DROP TRIGGER public.users_on_insert_trigger ON users");
        $this->addSql("DROP FUNCTION public.users_insert_trigger()");
        $schema->dropTable('users');
    }
}

这会产生以下错误:

SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "public.users" does not exist

并产生以下 sql:

CREATE OR REPLACE FUNCTION public.users_insert_trigger()
    RETURNS TRIGGER AS $$
    BEGIN
        NEW.name := NEW.name || ' test';
        RETURN NEW;
    END;
    $$
    LANGUAGE plpgsql;

CREATE TRIGGER users_on_insert_trigger
    BEFORE INSERT ON public.users
    FOR EACH ROW EXECUTE PROCEDURE public.users_insert_trigger();

CREATE TABLE public.users (id SERIAL NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id));
INSERT INTO common.migrations (version) VALUES ('20151211173441');

如果我没有理解错的话,架构的更改会在迁移结束时应用。 但它不适合我...

那么,我该如何处理呢?

您正确地总结了问题:迁移运行器实际上执行了您通过 addSQL() 添加的 SQL,然后 SQL 使用模式生成。

您需要将此更改作为两个单独的迁移进行。

好的,我发现了 2 个相关问题:

所以你可以:

  1. 正如@wschalle 所说,您可以通过两次迁移来处理它
  2. 另一种方式 - 不要使用模式进行迁移(我更喜欢)

没有 Schema,你的迁移看起来像这样

<?php

public function up(Schema $schema)
{
    $platform = $this->connection->getSchemaManager()->getDatabasePlatform();

    $table = new Table('table_name'/*, ...*/);
    // ...

    $sql = $platform->getCreateTableSQL($table);
    // or
    $sql = $platform->getDropTableSQL($table);
    // etc.

    $this->addSql($sql);
}