【问题标题】:Yii2 migration flexible Database EngineYii2 迁移灵活的数据库引擎
【发布时间】:2021-01-09 17:22:20
【问题描述】:

我有一个框架Yii2 的PHP 应用程序。我希望这个应用程序可以与 Postgresql、MySql 或 SQL Server 等数据库引擎一起运行。问题是如何迁移它。例如,您知道 Postgresql 和 SQL Server 使用模式作为数据库的子集,而不是 MySQL。

我正在使用带有 historymainlog 等架构的 Postgresql 开发我的应用程序。现在我想尝试使用 MySQL 运行我的应用程序。我必须做些什么来实现这一目标?

POSTGRESQL
    my_database -> database name
        main -> schema
            tables
        history -> schema
            tables

我希望我的迁移可以运行任何您使用的数据库引擎(postgresql、mssql 或 mysql),而无需控制器/模型/等。

【问题讨论】:

  • 如果您的迁移文件包含特定于数据库引擎的内容,您必须创建新的迁移文件或重写迁移文件以使其与引擎无关。

标签: mysql sql-server postgresql yii2 database-migration


【解决方案1】:

您可以扩展yii\db\Migration 并根据您在每种方法中使用的数据库系统类型添加条件。

例如,对于应用于所有方法的默认值,我扩展 yii\db\Migration 并覆盖 init()

    public function init()
    {
        parent::init();

        switch ($this->db->driverName) {
            case 'mysql':
                $this->tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
                $this->dbType = 'mysql';
                break;
            case 'pgsql':
                // specifics for pgsql
            default:
                throw new \RuntimeException('Your database is not supported!');
        }
    }

那么你所有的迁移都应该扩展这个。

据此,通过相同的迁移,您可以针对特定的数据库系统进行特定的操作。

【讨论】:

  • 如果我有一个 tableName = 'history.user_login' 的 activerecord 模型呢?在 postgresql 中,“历史”是模式。 mysql如何处理这个?
  • 不知道 pgsql 的细节。我的帖子的想法是 Yii 允许识别您正在使用的数据库类型,因此您可以为每个数据库添加特定的代码。您最初的问题是关于迁移。也许你应该问另一个关于 Yii2 Active Records 和 PostgreSQL 的问题,或者在这里查看第二个答案:stackoverflow.com/questions/47228767/…。如果覆盖getDb(),则可以指定每个 Active Record 的 db 连接
  • 好的,谢谢你的回答@gabriel-a-lópez-lópez
  • 它现在更新了参考,我认为有你的解决方案
  • 是的。根据您的参考,我认为我的 Active Record 模型在使用 mysql 时需要改进。所以我们需要更多的数据库连接,因为mysql会创建新的数据库作为模式。对于 mysql 一个模式(数据库)的一个连接。这是目前很好的解决方案。谢谢兄弟!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多