Yii2: поддержка MySQL и PostgreSQL - PullRequest
       13

Yii2: поддержка MySQL и PostgreSQL

0 голосов
/ 09 января 2019

Мое приложение Yii2 должно позволять клиентам использовать MySQL или PostgreSQL в качестве базы данных. Поэтому мне нужно написать код, который работает для обеих баз данных.

Я начал поддерживать MySQL и мне нужно усовершенствовать специфический для MySQL код, например, в миграциях:

public function up() {
    $this->execute('ALTER SCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci');
    $this->execute('ALTER SCHEMA CHARACTER SET utf8 COLLATE utf8_general_ci');
    $this->createTable('user', [ 
            'id' => $this->primaryKey(),
            ... 
        ],
       'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB'
    );
}

Как переписать этот кусок кода?

Есть ли репозитории, которые занимались этим? Каковы лучшие практики для совместимости MySQL и PostgreSQL?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Если я правильно понимаю, что вы говорите о написании миграций, которые могут обрабатывать определенные ключевые слова или функции БД в зависимости от выбранных или целевых баз данных, вам, возможно, придется создать собственную логику для этого, чтобы миграции поддерживали ее.

Я использую следующий класс в качестве базового класса миграции и расширяю миграции из этого класса для ограничений tableOptions и отбрасывания столбцов. Вы можете обновить его и добавить необходимые операции / функции в соответствии с вашими потребностями. Но это может создать логику для реализации того, что вы просите.

<?php

namespace console\migrations;
use Yii;
class Migration extends \yii\db\Migration
{

    /**
     * @var string
     */
    protected $tableOptions;

    /**
     * @var string
     */
    protected $restrict = 'RESTRICT';

    /**
     * @var string
     */
    protected $cascade = 'CASCADE';

    /**
     * @var string
     */
    protected $noAction = 'NO ACTION';

    /**
     * @var mixed
     */
    protected $dbType;

    /**
     * @inheritdoc
     */
    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':
                $this->tableOptions = null;
                $this->dbType = 'pgsql';
                break;
            case 'dblib':
            case 'mssql':
            case 'sqlsrv':
                $this->restrict = 'NO ACTION';
                $this->tableOptions = null;
                $this->dbType = 'sqlsrv';
                break;
            default:
                throw new \RuntimeException('Your database is not supported!');
        }
    }

    /**
     * Drops the constraints for the given column
     *
     * @param string $table  the table name
     * @param string $column the column name
     *
     * @return null
     */
    public function dropColumnConstraints($table, $column)
    {
        $table = Yii::$app->db->schema->getRawTableName($table);
        $cmd = Yii::$app->db->createCommand(
            'SELECT name FROM sys.default_constraints
            WHERE parent_object_id = object_id(:table)
            AND type = \'D\' AND parent_column_id = (
                SELECT column_id
                FROM sys.columns
                WHERE object_id = object_id(:table)
                and name = :column
            )', [':table' => $table, ':column' => $column]
        );

        $constraints = $cmd->queryAll();
        foreach ($constraints as $c) {
            $this->execute('ALTER TABLE ' . Yii::$app->db->quoteTableName($table) . ' DROP CONSTRAINT ' . Yii::$app->db->quoteColumnName($c['name']));
        }
    }

}
0 голосов
/ 09 января 2019

Я не так хорошо знаком с Postgre, но, судя по базовому переносу в app-advanced, вы можете проверить driverName и создать на его основе другую логику.

Файл миграции

$tableOptions = null;
if ($this->db->driverName === 'mysql') {
    $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...