postgresql - 如何迁移到使用 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'
它也没有用。
解决方案
嗯,谢谢。我读到这个:
架构应通过 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
在模式中不存在,所以我必须创建它。
推荐阅读
- c++ - 使用 BFS 在 Boost BGL 图中查找所有可到达的顶点
- bash - Suppress output of ftp in a shell script while executed in a cron job
- r - 如何为多个列应用一个函数并在之后生成平均值?
- angular - To find the element in DOM without using document.getElementById() generated using *ngFor in angular 2+
- reporting-services - How to determine if an SSRS text report parameter is blank?
- sql - 查询以查找 A 中的所有记录,这些记录在 B 中没有特定条件的连接记录
- php - How to override service arguments during it's call
- r - 在 Shiny 服务器中获取 std::bad_alloc 错误
- ruby-on-rails - 在 Ruby on Rails 中使用“includes”子句时按两个表中的列排序
- c++ - 如何在 Windows 8 中安装自定义凭据提供程序