Pull to refresh

Comments 20

я думал, что без боли, это когда миграции абстрагированы от вендора, чтобы можно было развернуться на любой SQL-БД.
если будете писать на вендоро-независимом SQL, то почему бы и нет
о том и речь, что миграции должны быть описаны абстракцией над запросами, а не sql.
SqlAlchemy, как я понимаю, как раз так написана.
там, где у posgres CREATE OR REPLACE FUNCTION, у ms sql ALTER PROCEDURE. у ms sql параметры к процедуре начинаются с символа "@", который postgres в префиксе параметра использовать запрещает, поэтому абстрагироваться от вендора не получится.
безболезненные инкрементные патчи, которые учитывают зависимости – уже благо. хотя интересно, как этот инструмент поступает с перегруженными функциями (одинаковое имя, разное количество или тип входных параметров).
вы просто погуглите — найдете во всех ЯП подобные миграции. Ну а фолбэки на голос sql всегда тоже можно.
гуглил, и что уж там, пытался мигрировать с ms sql, на, как раз postgres. если в БД хранимые процедуры измеряются тысячами, это малореальная задача. и мне кажется, что в более-менее больших проектах, лучше использовать особенности каждого вендора по максимуму, чтобы не было ситуации «работает везде, но не очень».
то есть в вашем случае бибилиотека, предоставляющая абстракцию над миграциями, не работала? issue написали на гитхабе?
или мы вообще не о библиотеках, а о миграции с одной СУБД на другую без миграций, описанных в статье?
Я имел в виду не миграции с движка на движок. Sqlibrist решает задачу изменений структуры БД при, скажем, разработке и переносе этих изменений с девелоперской на другие экземпляры базы: тестовую, продакшен. Когда нужно написать патч, меняющий/добавляющий объекты базы.
и я имел это же в виду. Абстрактные миграции позволяют не только диффы переносить, но и в целом безболезненно мигрировать на другую СУБД. Например SqlAlchemy для python это умеет (да и вообще любая популярная бибилиотека мигнраций на любом языке).
Алхимия, а вернее Alembic, умеет не все. Хранимые процедуры ему не под силу
вполне может быть. всегда найдутся какие-то vendor-specific features, которые используются в 5% проектов. Что не отменяет общего посыла треда.
именно, миграция с одной СУБД на другую.
ну так а это уже вопрос другой. Мы тут про библиотеки, позволяющие безболезненно мигрировать. Описываешь абстрактным языком все изменения в схеме, переносишь на другую СУБД, вводишь команду миграции и вуаля. Без библиотек миграции миграция на другую субд — это боль конечно.
Да, есть специфические вещи, не поддающиеся вендор-абстракции.
да, теперь понятно, я почему-то ваш первый комментарий истолковал, как миграцию с одного вендора в девелоперской версии в, например, другого вендора в тестовой версии.
Поступает, как следует. Например, есть две перегруженные функции: test(a integer) и test(b text). Описываем каждую в отдельном файле:

test_int.sql:

--UP
create function test(a integer) 
returns boolean 
as $$ 
return true; 
$$ 
language plpgsql;

--DOWN
drop function test(integer);


test_text.sql:

--UP
create function test(b text) 
returns boolean 
as $$ 
return false; 
$$ 
language plpgsql;

--DOWN
drop function test(text);


Теперь, если вы меняете одну из них, скажем, первую, то она сначала удалится инструкцией из раздела --DOWN, а потом пересоздастся. При этом DROP FUNCTION отличаются типами аргументов, поэтому путаницы не будет.
UFO just landed and posted this here
Это костыль и только для этого конкретного случая. Если надо поменять тип существующего аргумента, тип результата, без DROP-CREATE не обойтись
UFO just landed and posted this here
Так и есть. Каждый патч исполняется внутри транзакции (только в PostgreSQL). Если при накатывании патча произошла ошибка, транзакция откатывается
Sign up to leave a comment.

Articles