微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Doctrine Migrations 模式管理器在没有 ORM 的情况下生成 SQL 差异

如何解决使用 Doctrine Migrations 模式管理器在没有 ORM 的情况下生成 SQL 差异

什么?

我们正在使用学说迁移来跨多个数据库后端传播数据库更改。我们的迁移在部署时自动执行。它们总是原子的并且与代码向后兼容,所以这里没有问题。目前我们使用的是普通 sql

public function up(Schema $schema): void
{
    $this->addsql('CREATE TABLE foo');
}

这很好,但我不喜欢的是每个团队成员在不同的工具中生成了alter sql,并且格式略有不同。差异通常是装饰性的,但有时是功能性的。有时缺少排序规则,有时关键字不是大写,有时标识符没有被引用等。

考虑的替代方案

我想使用架构管理器来更改数据库

public function up(Schema $schema): void
{
    $schema->createTable('foo');
}

这很有效,但有一个非常重要的缺点。实际执行的 sql 查询是在执行时计算的。如果各种生产模式不同步,这可能很关键。这可能会产生超出其应有的效果,或者更糟的是,会丢弃不应有的东西。并且因为它们是自动执行的,所以我们无法在执行前检查 sql

问题

有没有办法使用架构管理器指定架构更改并同时生成 sql 差异?

我的粗略想法是在迁移类中添加一个方法

public function migration(Schema $schema): void
{
    $table = $schema->getTable('mytable');
    $column = $table->addColumn('column1',Types::INTEGER);
    $column->setLength(20);
    $column->setDefault(100);
    $table->addindex(['column1'],'someIndexName');
}

public function up(Schema $schema): void
{
    // this down() migration is auto-generated,please modify it to your needs
    $this->addsql('<<< GENERATED sql >>>');
}

public function down(Schema $schema): void
{
    // this down() migration is auto-generated,please modify it to your needs
    $this->addsql('<<< GENERATED sql >>>');
}

一个工具会生成您当前的数据库架构并将其传递给 migration 方法。这将生成一个“改变的”模式。这将对双方进行区分以生成将写入各自函数的向上和向下迁移。这使您既可以在代码中指定迁移,又可以控制在 git 中提交并在实时数据库上执行的实际 sql 查询

是否有一种工具、配置或插件可以以这种方式工作?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。