Миграции и Инсталляции
Миграции и Инсталляции
291.00K
Category: programmingprogramming

Миграции и инсталляции

1. Миграции и Инсталляции

Климов П.В.
QuartSoft
YiiSoft

2.

Инсталляция рабочей копии проекта
Настройка окружения
(GIT, PHP, Composer и т.д.)
Развертывание PHP кода
$ git clone
$ composer install
Проверка требований
$ php requirements.php

Донастройка окружения
(php.ini, Imagick и т.д.)
+
Создание локальных
директорий
(‘@assets’, ‘@runtime’)
Создание локальных файлов
(‘config/local.php’, ‘.htaccess’)
Миграция БД
$ php yii migrate/up
Дополнительные действия
(crontab, sitemap и т.п.)

3.

Обновление рабочей копии проекта
Обновление PHP кода
$ git pull
$ composer install/update
Проверка требований
$ php requirements.php

Донастройка окружения
(php.ini, Imagick и т.д.)
+
Очистка временных
директорий
(‘@assets’, ‘@runtime’)
Обновление (пересоздание)
локальных файлов
(‘config/local.php’, ‘.htaccess’)
Миграция БД
$ php yii migrate/up
Дополнительные действия
(crontab, sitemap и т.п.)

4.

Откат рабочей копии проекта
Миграция (откат) БД
$ php yii migrate/down
Откат PHP кода
$ git reset/checkout
$ composer install
Очистка временных
директорий
(‘@assets’, ‘@runtime’)
Дополнительные действия
(crontab, sitemap и т.п.)
Обновление (пересоздание)
локальных файлов
(‘config/local.php’)

5.

Системы контроля версий
Database
DB
Migration

6.

Миграции по разным рабочим копиям
“Dev”
t
“Production”
A
A
B
B
C
C
D
D

7.

class m170506_185632_createUser extends Migration {
public function up() {
$this->createTable(‘User’, []);
}
public function down() {
echo "m???_createUser cannot be reverted.\n";
return false;
}
class m170506_185632_createUser extends Migration {
public function up() {
$this->createTable(‘User’, []);
}
public function down() {
$this->dropTable(‘User’);
}

8.

История PHP и история БД
“Dev”
“Production”
PHP
DB
PHP
DB
1
A
1
A
2
3
2
B
4
5
t
6
3
B
4
C
5
6
C

9.

class m141106_185632_log_init extends Migration {
public function up() {
foreach (Yii::$app->getLog()->targets as $target) {
if ($target instanceof DbTarget) {
$this->createTable($target->logTable, […]);
}
}
}
class m141106_185632_log_init extends Migration {
public function up() {
$columns = […];
$this->createTable(‘AppLog’, $columns);
$this->createTable(‘ErrorLog’, $columns);
}

10.

use app\models\User;
class m141106_185632_updateUser extends Migration {
public function up() {
User::updateAll([‘statusId’ => 5], [‘statusId’ => 10]);
}
public function down() {
foreach (User::find()->where([‘statusId’ => 10])->all() as $user) {
$user->statusId = 5;
}
}
class m141106_185632_updateUser extends Migration {
public function up() {
$this->update(‘User’, [‘statusId’ => 5], [‘statusId’ => 10]);
}
}

11.

class m141106_185632_createFaqCategory extends Migration {
public function up() {
$this->createTable(‘FaqCategory’, […]);
}
}
class m141106_185632_createFaqQuestion extends Migration {
public function up() {
$this->createTable(‘FaqQuestion’, […]);
}
}
class m141106_185632_createFaq extends Migration {
public function up() {
$this->createTable(‘FaqCategory’, […]);
$this->createTable(‘FaqQuestion’, […]);
}
}

12.

«Инсталляция» расширения / модуля
$ composer require/update
Применение на уровне PHP
(конфигурация
компонентов и модулей)
Применение на уровне БД
(создание миграции БД)
Миграция БД
$ php yii migrate/up

13.

Применение миграций из нескольких
источников
“My Project”
“some/extension”
m170501_A
m150501_External
m170502_B
m170504_C

14.

Переключение «migrationPath»
$ php yii migrate
--migrationPath=@app/migrations
$ php yii migrate
--migrationPath=@some/extension/migrations
Использование пространства имен
return [
'controllerMap' => [
'migrate' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationNamespaces' => [
'app\migrations',
'some\extension\migrations',
],
],
],
// …
];

15.

История на сервере разработки
“My Project”
“some/extension”
m150501_External
m170501_A
m170502_B
Расширение
подключено
03-05-17
m170504_C
t
“Зависит от”

16.

История на «production» сервере
“My Project”
“some/extension”
m150501_External
migrationPath=app/migrations
m170501_A
m170502_B
“Зависит от”
m170504_C
migrationPath=some/extension/migrations
t

17.

История на «production» сервере
“My Project”
С «нуля» миграции
применяются в
хронологическом порядке
“some/extension”
m150501_External
m170501_A
m170502_B
“Зависит от”
m170504_C
t

18.

Повторное использование кода
$array = [$day1Revenue, $day2Revenue, $day3Revenue];
$avgRevenue = array_sum($array) / count($array);
// …
$array = [$day1Costs, $day2Costs, $day3Costs];
$avgCosts = array_sum($array) / count($array);
function avg (array $values) {
return array_sum($values) / count($values);
}
$avgRevenue = avg([$day1Revenue, $day2Revenue, $day3Revenue]);
// …
$avgCosts = avg([$day1Costs, $day2Costs, $day3Costs]);

19.

Рефакторинг
function avg (array $values) {
if (empty($values)) {
return 0;
}
return array_sum($values) / count($values);
}
$avgRevenue = avg([$day1Revenue, $day2Revenue, $day3Revenue]);
// …
$avgCosts = avg([$day1Costs, $day2Costs, $day3Costs]);

20.

Внешняя миграция, ревизия №1
class m160201_132117_someExtensionMigration extends Migration
{
public function up()
{
$this->createTable(‘BlogPostCategory’, […]);
$this->createTable(‘BlogPost’, […]);
}
public function down()
{
$this->dropTable(‘BlogPost’);
$this->dropTable(‘BlogPostCategory’);
}
}

21.

Внешняя миграция, ревизия №2
class m160201_132117_someExtensionMigration extends Migration
{
public function up()
{
$this->createTable(‘BlogPostCategory’, […]);
$this->createTable(‘BlogPost’, […]);
$this->createTable(‘BlogPostComment’, […]);
}
public function down()
{
$this->dropTable(‘BlogPostComment’);
$this->dropTable(‘BlogPost’);
$this->dropTable(‘BlogPostCategory’);
}
}

22.

Раздельная история
$ php yii migrate
--migrationPath=@app/migrations
$ php yii migrate
--migrationPath=@some/forum/migrations
--migrationTable=migration_forum
return [
'controllerMap' => [
'migrate-forum' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationNamespaces' => [
'some\forum\migrations',
],
'migrationTable' => 'migration_module',
],
],
// …
];

23.

Наследование
// Без пространства имен:
require (Yii::getAlias(‘@some/extension/
m160201_132117_someExtensionMigration.php’));
class m170505_142134_applySomeExtension extends
m160201_132117_someExtensionMigration {}
// С пространством имен:
namespace app\migrations;
class M170505142134ApplySomeExtension extends
\some\extension\migrations\M160201132117SomeExtensionMigration {}

24.

История при наследовании
“My Project”
“some/extension”
m150501_External
m170501_A
m170502_B
m170502_X
“Зависит от”
m170504_C
t

25.

Наследование и модификация
require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’));
class m170505_142134_rbac extends m140506_102106_rbac_init
{
protected function getAuthManager()
{
return new yii\rbac\DbManager([‘itemTable’ => ‘RbacItem’, …]);
}
public function up()
{
parent::up();
$this->alterColumn($this->getAuthManager() ->assignmentTable,
‘user_id’, $this->integer()->notNull());
}
}

26.

Инверсия
require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’));
class m170505_142134_undoRbac extends m140506_102106_rbac_init
{
protected function getAuthManager()
{
return new yii\rbac\DbManager([‘itemTable’ => ‘RbacItem’, …]);
}
public function up()
{
parent::down(); // down -> up
}
public function down()
{
parent::up(); // up -> down
}

27.

Агрегация
require (Yii::getAlias(‘@some/extension/m160201_132117_A.php’));
require (Yii::getAlias(‘@another/extension/m150301_141133_B.php’));
class m170505_142134_aggregation extends \yii\db\Migration
{
public function up()
{
(new m160201_132117_A([‘db’ => $this->db]))->up();
(new m150301_141133_B([‘db’ => $this->db]))->up();
}
public function down()
{
(new m150301_141133_B([‘db’ => $this->db]))->down();
(new m160201_132117_A([‘db’ => $this->db]))->down();
}
}

28.

Агрегация с пространством имен
namespace app\migrations;
use some\extension\M160201132117A.php’;
use another\extension\M150301141133B.php;
class M170505142134Aggregation extends \yii\db\Migration
{
public function up()
{
(new M160201132117A([‘db’ => $this->db]))->up();
(new M150301141133B([‘db’ => $this->db]))->up();
}
public function down()
{
(new M150301141133B([‘db’ => $this->db]))->down();
(new M160201132117A([‘db’ => $this->db]))->down();
}
}

29.

История при агрегации
“My Project”
“some/extension”
“another/extension”
m150501_Ex1
m170501_A
1
m170505_Ex2
m170510_B
1
1
m170512_X
1
“Зависит от”
m170514_C
t

30.

Независимое использование
миграций
use my\extension\M170505142134Foo;
class InstallController extends \yii\console\Controller
{
public function actionInstall()
{
(new M170505142134Foo([‘db’ => Yii::$app->db]))->up();
}
public function actionUninstall()
{
(new M170505142134Foo([‘db’ => Yii::$app->db]))->down();
}
}

31.

Миграции в модульных тестах
class BlogPostTest extends TestCase
{
protected function setUp()
{
$this->mockApplication();
Yii::$app->db->beginTransaction();
(new M170505142134Foo([‘db’ => Yii::$app->db]))->safeUp();
}
protected function tearDown()
{
Yii::$app->db->getTransaction()->rollback();
}
// …
}

32. Миграции и Инсталляции

• Инсталляция, обновление, откат
рабочей копии проекта
• Миграции – VCS для БД
• Типичные ошибки
• Применение миграций из нескольких
источников
• Независимое использование миграций
http://www.yiiframework.com/
English     Русский Rules