Как я могу поместить базу данных в git (контроль версий)? - PullRequest
249 голосов
/ 11 мая 2009

Я делаю веб-приложение, и мне нужно сделать ветку для некоторых важных изменений, дело в том, что эти изменения требуют изменений в схеме базы данных, поэтому я бы хотел также поместить всю базу данных в git .

Как мне это сделать? есть ли конкретная папка, которую я могу хранить в репозитории git? Как я узнаю какой? Как я могу быть уверен, что ставлю нужную папку?

Мне нужно быть уверенным, потому что эти изменения не имеют обратной совместимости; Я не могу позволить себе облажаться.

База данных в моем случае - PostgreSQL

Edit:

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

Должен быть лучший путь.

Обновление:

ОК, так что лучшего способа нет, но я все еще не совсем уверен, поэтому я немного изменю вопрос:

Я хотел бы поставить всю базу данных под контроль версий, какой механизм базы данных я могу использовать, чтобы я мог поставить реальную базу данных под контроль версий вместо ее дампа?

Будет ли sqlite дружелюбным к людям?

Поскольку это только среда разработки, я могу выбрать любую базу данных, какую захочу.

Edit2:

Что я действительно хочу, так это не отслеживать историю своего развития, а уметь переключаться с моей ветки «новые радикальные изменения» на «текущую стабильную ветку» и, например, исправлять некоторые ошибки / проблемы и т. Д. с текущей стабильной веткой. Таким образом, когда я переключаю ветки, база автоматически становится совместимой с веткой, в которой я сейчас работаю. Меня не особо волнуют фактические данные.

Ответы [ 23 ]

127 голосов
/ 11 мая 2009

Взять дамп базы данных и вместо этого контролировать версию. Таким образом, это простой текстовый файл.

Лично я предлагаю вам сохранить как дамп данных, так и дамп схемы. Таким образом, используя diff, становится довольно легко увидеть, что изменилось в схеме от ревизии до ревизии.

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

48 голосов
/ 11 мая 2009

Ознакомьтесь с разделом Рефакторинг баз данных (http://databaserefactoring.com/)), где вы найдете множество полезных методов для поддержки вашей базы данных в тандеме с изменениями кода.

Достаточно сказать, что вы задаете неправильные вопросы. Вместо того, чтобы помещать вашу базу данных в git, вы должны разбивать ваши изменения на небольшие проверяемые шаги, чтобы вы могли легко переносить / откатывать изменения схемы.

Если вы хотите получить полное восстановление, вам следует рассмотреть возможность архивирования журналов WAL postgres и использовать PITR (восстановление на момент времени) для воспроизведения / пересылки транзакций в определенные известные хорошие состояния.

26 голосов
/ 12 мая 2009

Я начинаю думать о действительно простом решении, не знаю, почему я не думал об этом раньше !!

  • Дублируйте базу данных (и схему, и данные).
  • В ветке для новых основных изменений просто измените конфигурацию проекта, чтобы использовать новую дублирующую базу данных.

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

EDIT:

Под дубликатом я подразумеваю создание другой базы данных с другим именем (например, my_db_2); не делать дамп или что-то в этом роде.

19 голосов
/ 15 февраля 2010

Используйте что-то вроде LiquiBase , это позволит вам контролировать версии ваших файлов Liquibase. вы можете пометить изменения только для производства и сделать, чтобы lb обновлял вашу БД для производства или разработки (или любой другой схемы).

6 голосов
/ 25 февраля 2011

Существует великий проект под названием «Миграции в рамках доктрины», который был построен именно для этой цели.

Он все еще в альфа-состоянии и построен для php.

http://docs.doctrine -project.org / проекты / Доктрина-Миграция / ы / последняя / index.html

4 голосов
/ 24 сентября 2018

Столкнулся с аналогичной потребностью, и вот что привело мое исследование систем управления версиями базы данных:

  1. Sqitch - открытый исходный код на основе Perl; доступно для всех основных баз данных, включая PostgreSQL https://github.com/sqitchers/sqitch
  2. Mahout - только для PostgreSQL; контроль версий схемы базы данных с открытым исходным кодом. https://github.com/cbbrowne/mahout
  3. Liquibase - еще одна версия с открытым исходным кодом для управления версиями SW. бесплатная версия Datical. http://www.liquibase.org/index.html
  4. Datical - коммерческая версия Liquibase - https://www.datical.com/
  5. Flyway by BoxFuse - коммерческий sw. https://flywaydb.org/
  6. Еще один проект с открытым исходным кодом https://gitlab.com/depesz/Versioning Автор предоставляет руководство здесь: https://www.depesz.com/2010/08/22/versioning/
  7. Red Gate Change Automation - только для SQL Server. https://www.red -gate.com / продукты / SQL-разработка / SQL-изменение-автоматизация /
3 голосов
/ 11 октября 2017

Я хочу сделать что-то похожее, добавить изменения в базу данных в мою систему контроля версий.

Я собираюсь следовать идеям в этом посте от Владимира Хорикова "Лучшие практики создания версий баз данных" . В итоге я буду

  • сохраняет свою схему и справочные данные в системе управления источниками.
  • для каждой модификации мы создадим отдельный скрипт SQL с изменениями

Если это поможет!

3 голосов
/ 07 марта 2016

Я сталкивался с этим вопросом, так как у меня есть похожая проблема, когда что-то приближает структуру каталогов на основе БД, хранит «файлы», и мне нужен git для управления этим. Он распространяется через облако с использованием репликации, поэтому его точка доступа будет через MySQL.

Суть вышеприведенных ответов, похоже, аналогичным образом предлагает альтернативное решение заданной проблемы, в какой-то мере упускает из виду использование Git для управления чем-либо в базе данных, поэтому я попытаюсь ответить на этот вопрос.

Git - это система, которая по сути хранит базу данных дельт (различий), которая может быть собрана заново для воспроизведения контекста. Обычное использование git предполагает, что контекст - это файловая система, а эти дельты - это различия в этой файловой системе, но на самом деле все git - это иерархическая база данных дельт (иерархическая, потому что в большинстве случаев каждая дельта является коммитом, по крайней мере родители, расставленные на дереве).

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

Если вы хотите управлять изменениями в базе данных, у вас есть две отдельные проблемы, и я бы решил их отдельно (на вашем месте). Первый - это схема, второй - данные (хотя в вашем вопросе вы заявляете, что данные вас не беспокоят). В прошлом у меня была проблема с базой данных Dev и Prod, в которой Dev мог вносить постепенные изменения в схему, и эти изменения должны были документироваться в CVS и распространяться на них, наряду с дополнениями к одному из нескольких «статических». столы. Мы сделали это, имея третью базу данных под названием Cruise, которая содержала только статические данные. В любой момент можно было сравнить схему из Dev и Cruise, и у нас был сценарий, чтобы взять разность этих двух файлов и создать файл SQL, содержащий операторы ALTER, для его применения. Точно так же любые новые данные могут быть перенесены в файл SQL, содержащий команды INSERT. Пока поля и таблицы только добавляются и никогда не удаляются, процесс может автоматизировать создание операторов SQL для применения дельты.

Механизм, с помощью которого git генерирует дельты, равен diff, а механизм, с помощью которого он объединяет 1 или более дельт с файлом, называется merge. Если вы можете придумать метод разделения и слияния из другого контекста, git должен работать, но, как уже говорилось, вы можете предпочесть инструмент, который сделает это за вас. Моя первая мысль к решению этой проблемы - это https://git -scm.com / book / ru / v2 / Настройка Git-Git-Configuration # External-Merge-and-Diff-Tools , в которой подробно описывается, как заменить Внутренний инструмент сравнения и слияния в git. Я обновлю этот ответ, так как я придумаю лучшее решение проблемы, но в моем случае я ожидаю, что мне придется только управлять изменениями данных, поскольку база данных на базе БД может измениться, поэтому мое решение может быть не совсем то, что вам нужно.

3 голосов
/ 22 мая 2015

Взгляните на RedGate SQL Source Control.

http://www.red -gate.com / продукты / SQL-разработка / SQL-источник-контроль /

Этот инструмент представляет собой оснастку SQL Server Management Studio, которая позволит вам разместить базу данных под управлением исходного кода с помощью Git.

Это немного дорого - 495 долларов за пользователя, но есть 28-дневная бесплатная пробная версия.

Примечание Я никоим образом не связан с RedGate.

2 голосов
/ 09 июля 2017

Я выпустил инструмент для sqlite, который делает то, что вы просите. Он использует собственный драйвер diff, использующий инструмент sqlite projects 'sqldiff', UUID в качестве первичных ключей, и исключает sqlite rowid. Это все еще в альфа-версии, поэтому обратная связь приветствуется.

Postgres и mysql сложнее, так как двоичные данные хранятся в нескольких файлах и могут даже не быть действительными, если вы смогли сделать снимок.

https://github.com/cannadayr/git-sqlite

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...