学说迁移错误 - "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 个相关问题:
所以你可以:
- 正如@wschalle 所说,您可以通过两次迁移来处理它
- 另一种方式 - 不要使用模式进行迁移(我更喜欢)
没有 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);
}
你如何创建 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 个相关问题:
所以你可以:
- 正如@wschalle 所说,您可以通过两次迁移来处理它
- 另一种方式 - 不要使用模式进行迁移(我更喜欢)
没有 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);
}