![](/img/trans.png)
[英]How can a set PostgreSQL schema on the fly using Doctrine and Symfony?
[英]How migrate to specific schema of database PostgreSQL working with Symfony and Doctrine?
在使用make:entity
命令创建数据库结构后,我进行了迁移:
$ symfony 控制台制造:迁移
现在,我想将特定模式迁移到我的PostgresSQL
数据库中。
手册表。 这是一个常见的用例,除了基于 doctrine 实体生成的数据库结构之外,您可能还需要自定义表。 默认情况下, doctrine:migrations:diff
命令将删除此类表。 如果您遵循特定的方案,您可以将教义/dbal 配置为忽略这些表。 假设所有自定义表都以 t_ 为前缀。 在这种情况下,您只需将以下配置选项添加到您的 doctrine 配置中:
doctrine: dbal: schema_filter: ~^(?!t_)~
我知道schema_filter
是通过正则表达式应用于表名(仅表?)的过滤器。 好吧,但是schema_filter
没有引用创建到PostgreSQL
数据库中的模式。
那么如何将特定模式迁移到数据库中呢?
当我执行命令时:
$ symfony 控制台制造:迁移
它会创建一个迁移文件,其中包含一个 class 和函数 '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');
此参数在声明时不能赋值。 必须是 null。
是否可以使用它迁移到特定模式?
好吧,当我找到一种方法时,我是这样做的:
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'
它也没有用。
嗯,谢谢。 我读到这个:
架构应通过 db 连接 dsn 设置,默认情况下所有表都以该架构结束。
然后我尝试在doctrine.yaml
中设置连接参数: url
, dbname
dbname/schema
connectstring
,使用这个表示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
不存在于模式中,所以我必须创建它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.