首页 > 解决方案 > 如何迁移到使用 Symfony 和 Doctrine 的数据库 PostgreSQL 的特定模式?

问题描述

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

$ symfony 控制台 make:migration

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

在Symfony的文档中说:

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

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

我知道这schema_filter是通过正则表达式应用于表名(仅表?)的过滤器。好吧,但schema_filter没有引用创建到PostgreSQL数据库中的模式。

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

当我执行命令时:

$ symfony 控制台 make:migration

它创建了一个迁移文件,其中包含一个具有函数“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');

此参数在声明时不能赋值。必须为空。

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

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

public function up(Schema $schema) : void { // 这个 up() 迁移是自动生成的,请根据需要修改 $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', '迁移只能在 'postgresql' 上安全执行。');

     $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'

它也没有用。

标签: postgresqlsymfonydoctrine

解决方案


嗯,谢谢。我读到这个:

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

然后我尝试在doctrine.yaml: url,dbname和中设置连接参数connectstring,使用这个符号: dbname.schema, even: 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_versions在模式中不存在,所以我必须创建它。


推荐阅读