Поддержка идентичности структуры БД при командной...

19

Click here to load reader

Transcript of Поддержка идентичности структуры БД при командной...

Page 1: Поддержка идентичности структуры БД при командной разработке.

Поддержка идентичности

структуры БД при командной

разработке

Михаил Кечинов

Студия веб-разработок Михаила Кечинова

Page 2: Поддержка идентичности структуры БД при командной разработке.

Один разработчик, две базы

• Каждый запрос заносится в dev- и в production-базу.

• Для небольших проектов и одного человека.

dev product

ALTER …

Page 3: Поддержка идентичности структуры БД при командной разработке.

Один разработчик, три базы

• SQL-запрос на DEV1 и PRODUCTION

• Бэкап PRODUCTION и восстановление его на DEV2

dev_1 product

ALTER …

dev_2 BACKUP

Page 4: Поддержка идентичности структуры БД при командной разработке.

Один разработчик, три базы

• SQL-запрос на DEV2 и PRODUCTION

• Бэкап PRODUCTION и восстановление его на DEV1

dev_1 product

ALTER …

dev_2 BACKUP

Page 5: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз

<?php

define (“DB_REVISION”, 34);

$scripts = array();

$scripts[1] = array(

“CREATE TABLE `user` …”,

“CREATE TABLE `post` …”

);

$scripts[34] = array(

“ALTER TABLE `user` ADD COLUMN …”

);

• Скрипт с SQL-патчами.

• В БД хранится номер

последнего патча.

• Выполняем новые патчи.

• Меняем версию БД.

Page 6: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз

product

UPDATE.PHP

dev_2

DEV

SERV

2

UPDATE.PHP

dev_1

DEV

SERV

1

PROD

SERV

SVN

Page 7: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз

• SVN-конфликты при одновременном создании

одинаковых ревизий.

Page 8: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз II

CREATE TABLE `user` …;

CREATE TABLE `post` …;

• Отдельные

пронумерованные SQL-

файлы.

• В БД хранится номер

последнего патча.

• Выполняем новые патчи.

• Меняем версию БД.

ALTER TABLE `user` ADD COLUMN …;

34.SQL

1.SQL

Page 9: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз II

product

2.SQL

dev_2

DEV

SERV

2

1.SQL

dev_1

DEV

SERV

1

PROD

SERV

SVN

Page 10: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз II

• SVN-конфликты в дереве при одновременном

создании одинаковых файлов разруливаются

переименованием файлов.

• Конфликты порядка изменений имеют место.

Page 11: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз III

CREATE TABLE `user` …;

CREATE TABLE `post` …;

• Отдельные

пронумерованные SQL-

файлы по TIMESTAMP.

• В БД хранятся номера

обработанных файлов.

• Выполняем

необработанные файлы.

• Помещаем в БД номера

обработанных файлов.

ALTER TABLE `user` ADD COLUMN …;

20110514230417965.SQL

20110511231531121.SQL

Page 12: Поддержка идентичности структуры БД при командной разработке.

Два разработчика, много баз III

• Конфликты порядка изменений имеют место.

Page 13: Поддержка идентичности структуры БД при командной разработке.

Нерешенная проблема

Как избавиться от конфликта

порядка изменений?

Кроме регулярного обновления

Page 14: Поддержка идентичности структуры БД при командной разработке.

<?php

$filename = date(“YmdHisu”);

$content = “-- ” . date(“d.m.Y H:i”) . PHP_EOL;

$content .= “-- @author ” . PHP_EOL;

$content .= “-- @comment ” . PHP_EOL;

$content .= PHP_EOL;

file_put_contents($filename . “.sql”, $content);

echo “Revision file ” . $filename . “.sql created” . PHP_EOL;

Резюме

Page 15: Поддержка идентичности структуры БД при командной разработке.

Решение под PHP

Ruckusing

http://code.google.com/p/ruckusing/

Page 16: Поддержка идентичности структуры БД при командной разработке.

Ruckusing howto

> php generate.php create_user_table

db/migrate/20110602193549_CreateUserTable.php

Page 17: Поддержка идентичности структуры БД при командной разработке.

db/migrate/20110602193549_CreateUserTable.php

<?php

class CreateUserTable extends Ruckusing_BaseMigration {

public function up() {

$t = $this->create_table("users");

$t->column("first_name", "string");

$t->column("last_name", "string");

$t->column("email", "string", array('limit' => 128));

$t->finish();

$this->add_index("users", "email", array('unique' => true));

}

public function down() {

$this->drop_table("users");

}

}

?>

Page 18: Поддержка идентичности структуры БД при командной разработке.

Process

> php main.php db:migrate

Page 19: Поддержка идентичности структуры БД при командной разработке.

Михаил Кечинов

[email protected]

mkechinov.ru

+7 950 0099233

Контактные данные