提问者:小点点

如何迁移到特定模式的数据库PostgreSQL与Symfony和Doctrine工作?


在使用make:entity命令创建数据库结构之后,我进行了迁移:

Symfony控制台迁移

现在,我想迁移到一个特定的模式到我的PostgresSQL数据库中。

在Symfony的文件中说:

手动表格。这是一个常见的用例,除了基于条令实体生成的数据库结构之外,还可能需要自定义表。默认情况下,这样的表将由条令:迁移:diff命令删除。如果您遵循一个特定的方案,您可以配置条令/dbal来忽略这些表。假设所有自定义表的前缀都是t_。在这种情况下,您只需在条令配置中添加以下配置选项:

doctrine: dbal: schema_filter: ~^(?!t_)~

我知道schema\u filter是一个应用于表名(仅表?)的过滤器通过正则表达式。但是,schema\u filter没有将创建的模式引用到PostgreSQL数据库中。

那么如何将特定模式迁移到数据库中呢?

当我执行命令时:

Symfony控制台迁移

它创建一个迁移文件,其中包含一个函数为up和down的类,这两个函数都带有一个参数$schema。这里有一个片段:

 public function up(Schema $schema) : void
 {
     // this up() migration is auto-generated, please modify it to your needs
     $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');

     $this->addSql('CREATE SEQUENCE division_id_seq INCREMENT BY 1 MINVALUE 1 START 1');

此参数在声明时无法赋值。必须为空。

是否可以使用它迁移到特定的模式?

嗯,当我找到一种方法时,我是这样做的:

公共函数up(模式$schema):无效{//这个up()迁移是自动生成的,请根据您的需要修改它$this-

     $this->addSql('CREATE SEQUENCE my_schema_name.division_id_seq INCREMENT BY 1 MINVALUE 1 START 1');

我的意思是,我在命令生成的所有迁移代码中写入模式名称。

但我仍然相信,可以用另一种方式做到这一点。如果是,那怎么办?

我给忘了。当我尝试使用第一句之前的这一行时,迁移失败:

 $this->addSql('SET search_path TO my_schema_name');

我还尝试将架构名称分配给参数$schema:

 $schema = 'my_schema_name'

它也不起作用。


共1个答案

匿名用户

好的,谢谢你。我读到:

模式应该通过db连接dsn设置,默认情况下,所有表都以该模式结束。

然后我尝试在原则中设置连接参数。yamlurldbnameconnectstring,使用以下符号:dbname。schema,甚至:dbname/schema,但它不起作用。

尽管如此:

您不应该将架构名称硬编码到迁移中。

在迁移文件中需要设置连接的模式:

public function up(Schema $schema) : void
{
    // this up() migration is auto-generated, please modify it to your needs
    $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');

    $this->connection->exec('SET search_path TO my_schema_name;');

    $this->addSql('CREATE SEQUENCE division_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
    ...

但是,模式中不存在表migration\u versions,因此我必须创建它。