Як ви версите свою схему бази даних? [зачинено]


128

Як ви готуєте свої дельти SQL? чи зберігаєте ви вручну кожен SQL, що змінює схему, у папку дельти, або у вас є якийсь автоматизований процес, що відрізняється?

Мене цікавлять умовності щодо версії схеми бази даних разом із вихідним кодом. Можливо, гачок, який попередньо здійснює, що відрізняє схему?

Крім того, які варіанти для різних дельт існують крім DbDeploy ?

EDIT: бачачи відповіді, я хотів би уточнити, що я знайомий зі стандартною схемою виконання міграції баз даних за допомогою дельт. Моє запитання полягає у створенні самих дельт, бажано автоматично.

Крім того, версія призначена для PHP та MySQL, якщо вона має значення. (Ніяких рішень Ruby, будь ласка).


Я використовую schemasync для створення патча (і сценарію відкату). Вони додаються до репортажу SVN. Це не ідеально, але добре працює для мене. Крім того, розгортати зміни схеми досить просто за допомогою shemasync
Jay Sidri

Це посилання видається порожнім - чи все ще існує?
jocull

Схоже, переміщено: github.com/mmatuson/SchemaSync
Jay Sidri

Відповіді:


61

Побачити

Чи існує система управління версіями для зміни структури бази даних?

Як я можу версію своєї бази даних MS SQL у SVN?

і стаття Джеффа

Отримайте свою базу даних під контролем версій

Я відчуваю ваш біль, і я хотів би, щоб була краща відповідь. Це може бути ближче до того, що ви шукали.

Механізми відстеження змін схеми БД

Взагалі, я вважаю, що для цього немає адекватного прийнятого рішення, і я перекладаю свою власну справу в цій галузі.


Як ви можете сказати з мого запитання, мені відомо поняття дельти. Моє запитання стосується конвенцій для їх створення, бажано автоматично.
Еран Гальперін

Я здогадуюсь тоді я буду катати свій власний ...;)
Еран Гальперін

Ви випробували DBDiff: github.com/DBDiff/DBDiff ? Це добре підходить для того, що ви шукаєте @EranGalperin, оскільки це робить автоматизовані міграції як для схеми, так і для даних у SQL. Розкриття Я за цим розробником!
Джасдіп Халса


4

Якщо ви все ще шукаєте варіанти: погляньте на дизайнера neXtep. Це безкоштовне середовище розробки баз даних GPL, засноване на концепціях управління версіями. У середовищі ви завжди працюєте з суттєвими особами та можете зосередитись на розробці моделі даних. Після завершення випуску двигун покоління SQL, підключений до системи управління версіями, може генерувати будь-яку дельту, яка вам потрібна між двома версіями, і запропонує вам механізм доставки, якщо вам це потрібно.

Крім усього іншого, ви можете синхронізувати та зворотно синхронізувати свою базу даних під час розробок, створювати діаграми моделі даних, запитувати свою базу даних за допомогою інтегрованих клієнтів SQL тощо.

Перегляньте вікі для отримання додаткової інформації: http://www.nextep-softwares.com/wiki

В даний час він підтримує Oracle, MySql і PostgreSql і знаходиться в Java, тому продукт працює на Windows, Linux і Mac.


3

Я переконуюсь, що зміни схеми завжди є добавками. Тому я не відкидаю стовпці та таблиці, тому що це запам'ятовує дані і не може бути повернуто пізніше. Таким чином, код, який використовує базу даних, можна повернути назад, не втрачаючи даних або функціональних можливостей.

У мене є сценарій міграції, який містить оператори, які створюють таблиці та стовпці, якщо вони ще не існують, і заповнюють їх даними.

Сценарій міграції запускається кожного разу, коли виробничий код оновлюється та після нових установок.

Коли я хотів би щось скинути, я це роблю, видаляючи їх із сценарію встановлення бази даних та сценарію міграції, щоб ці застарілі елементи схеми поступово припинялися в нових установках. З недоліком того, що нові встановлення не можуть перейти на більш стару версію до встановлення.

І, звичайно, я виконую DDL за допомогою цих сценаріїв і ніколи безпосередньо в базі даних, щоб підтримувати синхронізацію.


2

Я не керую дельтами. Я вношу зміни в основну базу даних і маю інструмент, який створює сценарій збірки на основі XML на основі основної бази даних.

Коли настає час оновити існуючу базу даних, у мене є програма, яка використовує сценарій збірки на основі XML для створення нової бази даних та оголених таблиць. Потім я копіюю дані зі старої бази даних за допомогою INSERT INTO x SELECT FROM y, а потім застосовую всі індекси, обмеження та тригери.

З новими таблицями, новими стовпцями, видаленими стовпцями все обробляється автоматично та за допомогою декількох невеликих хитрощів, щоб налаштувати процедуру копіювання, я можу обробляти перейменування стовпців, зміни типу стовпців та інші основні рефактори.

Я б не рекомендував це рішення в базі даних з величезною кількістю даних, але я регулярно оновлюю базу даних, що перевищує 1 Гб, на 400 таблиць.


Це звучить дещо громіздко, особливо при роботі з кількома розробниками. Також процес збирання звучить вимогливо, і я хотів би бути максимально простим.
Еран Гальперін

Я визнаю, що для того, щоб виправитись, знадобився певний час, але зараз для підготовки попереднього оновлення потрібні майже ніякі зусилля, а ще менше виконання. Крім того, одне, що мені подобається, це те, що я можу робити проміжні зміни виправлення, і це не впливає на процедуру оновлення. Кожне оновлення - це новий новий БД.
Даррел Міллер

2

Ви не згадували, який RDBMS ви використовуєте, але якщо це MS SQL Server, Red-Gate SQL Порівняння був нам незамінний при створенні дельта між сценаріями створення об'єктів.


1
Це для Mysql, я оновив своє запитання
Еран Гальперін

2

Мені не доводиться заробляти власний ріг, але я розробив внутрішню веб-програму для відстеження змін у схемах баз даних та створення версій сценаріїв оновлення.

Цей інструмент називається Бразилія і тепер відкритий код за ліцензією MIT. Бразилія є рубіном / рубіном на рейках і підтримує розгортання змін у будь-якій базі даних, яку підтримує Ruby DBI (MySQL, ODBC, Oracle, Postgres, SQLite).

Планується підтримка для введення скриптів оновлення в контроль версій.


Бразилія виглядає досить добре, занадто погано, я використовую в основному PHP. Ви коли-небудь розглядали можливість перенесення системи?
Еран Гальперін


1

Ми експортуємо дані у портативний формат (за допомогою нашої інструментальної мережі), а потім імпортуємо їх у нову схему. немає необхідності в дельта SQL. Настійно рекомендується.


3
Що це за портативний формат? і як ви імпортуєте його в нову схему, застосовуючи лише відмінності від попередньої версії?
Еран Гальперін

1

Я використовую базу даних Firebird для більшості розробок і використовую для неї інструмент адміністрування FlameRobin . У ній є хороша опція для реєстрації всіх змін. Він може записати все до одного великого файлу або одного файлу за зміну бази даних. Я використовую цей другий варіант, а потім зберігаю кожен скрипт у програмному забезпеченні для управління версіями - раніше я використовував Subversion, тепер я використовую Git.

Я припускаю, що ви можете знайти якийсь інструмент MySQL, який має таку ж функцію ведення журналу, як FlameRobin для Firebird.

В одній із таблиць баз даних я зберігаю номер версії структури бази даних, тому можу легко оновити будь-яку базу даних. Я також написав простий скрипт PHP, який виконує ці сценарії SQL один за одним у будь-якій цільовій базі даних (шлях до бази даних та ім’я користувача / пароль подаються в командному рядку).

Також є можливість реєструвати всі висловлювання DML (вставити, оновити видалити), і я активую це, змінюючи деякі дані за замовчуванням, які містить кожна база даних.

Я написав гарну білу книжку про те, як я все це детально роблю. Ви можете завантажити папір у форматі .pdf разом із демонстраційними сценаріями PHP звідси .


1

Я також розробив набір скриптів PHP, де розробники можуть надсилати свої сценарії deltasql до центрального сховища.

В одній із таблиць баз даних (під назвою TBSYNCHRONIZE) я зберігаю номер версії останнього виконаного сценарію, тому я можу легко оновити будь-яку базу даних, використовуючи веб-інтерфейс або клієнт, розроблений спеціально для Eclipse.

Веб-інтерфейс дозволяє керувати кількома проектами. Він також підтримує бази даних "гілки".

Ви можете протестувати програму на веб- сайті http://www.gpu-grid.net/deltasql (якщо ви ввійдете як адміністратор із паролем testdbsync). Додаток з відкритим кодом та його можна завантажити тут: http://sourceforge.net/projects/deltasql

deltasql продуктивно використовується в Швейцарії та Індії, популярний у Японії.


1

Кілька місяців тому я шукав інструмент для версії MySQL-схеми. Я знайшов багато корисних інструментів, таких як міграція доктрин, міграція RoR, деякі інструменти, написані на Java та Python.

Але ніхто з них не задовольнив мої вимоги.

Мої вимоги:

  1. Немає вимог, виключайте PHP та MySQL
  2. Немає файлів конфігурації схеми, як-от schema.yml в Doctrine
  3. Здатний читати поточну схему з підключення та створювати новий сценарій міграції, ніж представляти ідентичну схему в інших установках програми.

Я почав писати міграційний інструмент, і сьогодні у мене є бета-версія.

Будь ласка, спробуйте, якщо у вас є інтерес до цієї теми. Будь ласка, надішліть мені майбутні запити та бугрепорти.

Вихідний код: bitbucket.org/idler/mmp/src Огляд англійською мовою: bitbucket.org/idler/mmp/wiki/Home Огляд російською мовою: antonoff.info/development/mysql-migration-with-php-project


У вас також є новий інструмент: DBV: stackoverflow.com/a/13837473/6309
VonC


1

Мене цікавить і ця тема.

На цю тему є деякі дискусії у вікі Джанго .

Цікаво те, що схоже, що CakePHP має вбудовану версію схеми за допомогою просто cake schema generateкоманди.


З того, що я читав про рішення торта - це версія в дуже базовому сенсі, однак вона не має різних можливостей, тому мені це не приносить користі.
Еран Гальперін

1

Для MySQL

Коли я сідаю на нову БД:

По-перше, я перевіряю структуру:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

Завдяки користувачам stackoverflow я міг написати цей швидкий скрипт, щоб знайти структурні відмінності.

src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

На другому кроці я перевіряю дані, таблиці за таблицею mysqldiff. Це трохи архаїчно, але цикл PHP, заснований на information_schemaданих, безперечно робить роботу

Для версій я використовую той самий спосіб, але я форматую сценарій оновлення SQL (для оновлення або відкоту) з різними результатами, і я використовую конвенцію про номер версії (у кількох модифікаціях номер версії виглядає як ip-адреса) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------

0

Я використовую сувору версію схеми бази даних (відстежується в окремій таблиці). Сценарії зберігаються в контролі версій, але всі вони перевіряють поточну версію схеми, перш ніж вносити будь-які зміни.

Ось повна реалізація для SQL Server (те саме рішення можна було б розробити для MySQL при необхідності): Як підтримувати версію схеми баз даних SQL Server


Я щойно прочитав вашу статтю. Ви все ще користуєтесь цим чи після цього прийняли позачергове рішення, таке як DBUp або ReadyRoll?
Девід Аткінсон

В даний час всі мої проекти покладаються на Entity Framework Code-First, і я використовую його міграцію для версії бази даних. Я маю рішення зі статті в декількох спадкових проектах, і я ніколи її не замінював. В інших проектах я використовував інструменти Redgate для управління схемами та міграціями.
Зоран Горват

Чудово, що ви користувач Redgate! Якщо ви хочете використовувати інструменти Redgate спільно з EF, можливо: red-gate.com/blog/database-lifecycle-management/…
Девід Аткінсон,

Я обов’язково спробую це при наступній нагоді. Це нам добре служило, але я тим часом змінив команду, і тепер я експериментую з підтримкою рідної EF, перш ніж висунути її вперед.
Зоран Горват

0

Після довгих розслідувань я зрозумів, що є якісь сторонні інструменти чи типи проектів Visual Studio, які мене не задовольняють, або просто блоги про теорію, але не реалізацію. Тому я впровадив робочу систему, яка використовується майже рік, і пояснив тут:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

залежно від інтересу, продовжуватиме писати більше.


2
Привіт, ласкаво просимо до SO. Ця відповідь насправді не є повною, в основному вона лише забезпечує посилання. Відповіді лише на посилання не найкращі: якщо посилання колись стане недійсним, ваша відповідь стане марною. Тому, будь ласка, відредагуйте його та додайте хоча б резюме того, що там можна знайти, щоб ваша відповідь мала значення незалежно від посилання. Дякую!
Фабіо каже: Відновити Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.