在使用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'
它也不起作用。
好的,谢谢你。我读到:
模式应该通过db连接dsn设置,默认情况下,所有表都以该模式结束。
然后我尝试在原则中设置连接参数。yaml
:url
、dbname
和connectstring
,使用以下符号: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
,因此我必须创建它。