Как я могу вывести структуру базы данных MySQL и импортировать ее, чтобы изменить таблицы с существующими данными? - PullRequest
1 голос
/ 14 октября 2011

Для начала немного контекста. Мой пример использования - то, что мы с партнером находимся на ранних стадиях веб-приложения. База данных была разработана, но мы все же в конечном итоге вносим изменения в структуру в соответствии с нашими потребностями. Поэтому нам нужен способ передачи туда и обратно структурных изменений в базе данных. Я пытался использовать git для хранения mysqldumps, чтобы мы могли передавать туда и обратно все данные (а также возвращать ошибки), но мы сталкиваемся с серьезными конфликтами из-за того, что наши сообщения имеют конфликтующие первичные ключи! Если есть какой-нибудь способ обойти это, остальная часть моего вопроса будет главным спорным. Предполагая, что нет решения, Мне нужен какой-то способ вывести структуру, которая может быть запущена без удаления всех существующих данных из таблиц БД.

Я научился делать дамп только структуры базы данных MySQL, используя mysqdump -d. Однако сюда входят команды DROP и CREATE. Поэтому запуск этого сценария SQL приводит к тому, что моя база данных становится пустой (поскольку каждая таблица удаляется перед созданием). Я ищу способ вывести структуру базы данных так, чтобы я мог ее импортировать и НЕ потерял свои данные. Короче говоря, я хочу иметь возможность выгружать базу данных и выводить команды ALTER или что-то похожее.

Теперь, когда я дошел до этого вопроса, кажется маловероятным, что было бы возможно вывести БД с помощью команд ALTER. Независимо от того, есть ли способ вывести данные MySQL таким образом, чтобы он мог изменить структуру таблиц, не удаляя существующие данные?

Большое спасибо!

Paragon

1 Ответ

2 голосов
/ 14 октября 2011

У вас уже есть свой ответ - напишите сценарии, которые изменяют структуру базы данных, создайте их версию в git и придумайте процесс их запуска.Тот, кто изменяет структуру, должен формализовать эти изменения в сценарии SQL.Обычно это просто создание таблицы или изменение таблицы DDL.Как и любой другой тип кода, эти изменения должны быть проверены.Тогда для любого из вас достаточно просто получить последний требуемый скрипт update.sql из git и запустить его через командную строку mysql или в инструменте.

Иногда просто изменить таблицу недостаточно - выТакже нужно делать запросы, которые конвертируют данные.Я также заблокирую соответствующие таблицы, чтобы при необходимости эти запросы можно было запускать в отношении производства.Просто назовите сценарии name.sql и установите соглашение о том, как вы будете их называть и где будете хранить их в своем дереве.Это может быть так же просто, как update_1.sql. Если вы уже работали с версиями DDL, вы можете поместить их в этот каталог.

Еще одна вещь ... большинство изменений таблицы alter не влияют на данные в базе данных.В редких случаях могут возникнуть проблемы, но вы всегда можете закодировать обходной путь в сценарии, например, используя временный столбец или таблицу, с некоторыми операторами SQL, которые перемещают данные назад и вперед во время перевода.

ТамЕсть инструменты, которые будут делать такие вещи для вас, но я не понимаю, зачем они вам нужны, когда вы контролируете структурные изменения.PHP ORM Doctrine2 обладает некоторыми из этих возможностей, и я видел другие продукты, которые предлагают такие же возможности ... сравнивая 2 дБ и определяя структурные изменения и DDL, необходимые для синхронизации структур.Это не поможет вам, когда вы оба будете пытаться работать независимо.

То, что я предложил, является простым и эффективным и использовалось во многих проектах, в которых я принимал участие.

...