Существует ли система управления версиями для изменений структуры базы данных?

Если вы хотите, вы можете использовать прямое выражение SQL:

expr = """
    CASE
        WHEN user_agent LIKE \'%Android%\' THEN \'mobile\'
        WHEN user_agent LIKE \'%Linux%\' THEN \'desktop\'
        ELSE \'other_unknown\'
    END AS user_agent_type"""

df = sc.parallelize([
    (1, "Android"), (2, "Linux"), (3, "Foo")
]).toDF(["id", "user_agent"])

df.selectExpr("*", expr).show()
## +---+----------+---------------+
## | id|user_agent|user_agent_type|
## +---+----------+---------------+
## |  1|   Android|         mobile|
## |  2|     Linux|        desktop|
## |  3|       Foo|  other_unknown|
## +---+----------+---------------+

, иначе вы можете заменить его комбинацией when и like и otherwise:

from pyspark.sql.functions import col, when
from functools import reduce

c = col("user_agent")
vs = [("Android", "mobile"), ("Linux", "desktop")]
expr = reduce(
    lambda acc, kv: when(c.like(kv[0]), kv[1]).otherwise(acc), 
    vs, 
    "other_unknown"
).alias("user_agent_type")

df.select("*", expr).show()

## +---+----------+---------------+
## | id|user_agent|user_agent_type|
## +---+----------+---------------+
## |  1|   Android|         mobile|
## |  2|     Linux|        desktop|
## |  3|       Foo|  other_unknown|
## +---+----------+---------------+

Вы также можете добавить несколько столбцов в один select:

exprs = [c.alias(a) for (a, c) in [
  ('etl_requests_usage', lit('DEV')), 
  ('etl_datetime_local', current_date())]]

df.select("*", *exprs)
119
задан Mark Harrison 30 September 2016 в 04:32
поделиться

20 ответов

В Ruby on Rails существует понятие миграция - быстрый сценарий для изменения базы данных.

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

К мигрируют , Вы выполняете команду, названную "db:migrate", который смотрит на Вашу версию и применяет необходимые сценарии. Можно мигрировать вниз похожим способом.

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

62
ответ дан Kalid 24 November 2019 в 01:49
поделиться

Я рекомендовал бы один из двух подходов. Во-первых, вложите капитал в PowerDesigner от Sybase. Enterprise Edition. Это позволяет Вам разрабатывать Физические модели данных, и многое другое. Но это идет с репозиторием, который позволяет Вам регистрироваться в своих моделях. Каждая новая регистрация может быть новой версией, она может сравнить любую версию с любой другой версией и даже с тем, что находится в Вашей базе данных в то время. Это тогда представит список каждого различия и спросит, который должен быть migrated†¦, и затем это создает сценарий, чтобы сделать это. It’s, не дешевый, но it’s сделка по дважды цене и it’s ROI, составляет приблизительно 6 месяцев.

другая идея состоит в том, чтобы включить аудит DDL (работы в Oracle). Это составит таблицу с каждым изменением, которое Вы вносите. При запросах изменений от метки времени, Вы в последний раз переместили свои изменения базы данных, чтобы подталкивать к прямо сейчас, you’ll, чтобы иметь заказанный список всего сделанный you’ve. Некоторые, где пунктам для устранения изменений балансовой суммы нравится, создают нечто таблицы; сопровождаемый нечто таблицы отбрасывания; и можно ЛЕГКО создать ультрасовременный сценарий. Почему сохраняют изменения в Wiki, that’s удваивают работу. Позвольте базе данных отследить их для Вас.

2
ответ дан 2 revs, 2 users 83%Mark Brady 24 November 2019 в 01:49
поделиться

Две книжных рекомендации: "Осуществляя рефакторинг Базы данных" Ambler и Sadalage и "Гибкими Методами Базы данных" Ambler.

Кто-то упомянул Миграции направляющих. Я думаю, что они работают отлично, даже за пределами приложений направляющих. Я использовал их на приложении ASP с SQL Server, который мы были в процессе перемещения в направляющие. Вы проверяете сами сценарии миграции в VCS. Вот сообщение Прагматически настроенного Dave Thomas на предмете.

1
ответ дан MattMcKnight 24 November 2019 в 01:49
поделиться

В отсутствие VCS для изменений таблицы я регистрировал их в Wiki. По крайней мере, тогда я вижу, когда и почему это было изменено. Это совсем не прекрасно как не, все делают его, и у нас есть несколько используемых версий продукта, но лучше чем ничего.

2
ответ дан steevc 24 November 2019 в 01:49
поделиться

Мы использовали Выпуск Системной базы данных Команды мс с довольно хорошим успехом. Это интегрируется с управлением версиями TFS и Visual Studio более или менее беспрепятственно и позволяет нам, управляет сохраненным procs, представлениями, и т.д., легко. Разрешение конфликтов может быть болью, но история версий завершена, как только это сделано. После этого миграции к QA и производство чрезвычайно просты.

справедливости ради стоит отметить, что это - продукт версии 1.0, тем не менее, и не без нескольких проблем.

3
ответ дан EndangeredMassa 24 November 2019 в 01:49
поделиться

Существует PHP5 "платформа миграции базы данных" под названием Ruckusing. Я не использовал его, но эти , примеры показывают идею при использовании языка для создания базы данных как и, когда необходимый, только необходимо отследить исходные файлы.

6
ответ дан Peter Coulton 24 November 2019 в 01:49
поделиться

ER Studio позволяет Вам инвертировать свою схему базы данных в инструмент, и можно тогда сравнить его для проживания баз данных.

Пример: Инвертируйте свою схему разработки в Studio ER - сравнивают его с производством, и это перечислит все различия. Это может написать сценарий изменений или просто протолкнуть их автоматически.

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

7
ответ дан EndangeredMassa 24 November 2019 в 01:49
поделиться

Я пишу свои сценарии выпуска дб параллельно с кодированием и сохраняю сценарии выпуска в определенном разделе проекта в SS. Если я вношу изменение в код, который требует изменения дб, то я обновляю сценарий выпуска одновременно. До выпуска я работаю на выпуске, пишут сценарий чистого dev дб (скопированная структура, мудрая от производства), и делают мое заключительное тестирование на нем.

7
ответ дан hamishmcn 24 November 2019 в 01:49
поделиться

У Разработчика PLSQL, инструмента от Всей Автоматизации Arround, есть плагин для репозиториев, который работает хорошо (но не большой) с Визуальным Безопасным Источником.

От сети:

Плагин Управления версиями обеспечивает тесную интеграцию между МН IDE Разработчика / IDE Разработчика SQL>> и любой Системой управления версиями, которая поддерживает Microsoft SCC Interface Specification.>> Это включает большинство популярных Систем управления версиями, таких как Microsoft Visual SourceSafe,>> Merant PVCS и Исходная Целостность MKS.

http://www.allroundautomations.com/plsvcs.html

7
ответ дан borjab 24 November 2019 в 01:49
поделиться

Я делал это прочь и на в течение многих лет - справляющийся (или пытающийся справиться) версии схемы. Лучшие подходы зависят от инструментов, которые Вы имеете. Если можно получить менеджера по Схеме "Программного инструмента Quest", Вы будете в хорошем состоянии. Oracle имеет свой собственный, нижний инструмент, который также называют "менеджером по Схеме" (путающий очень?), что я не рекомендую.

Без автоматизированного инструмента (см. другие комментарии здесь о Чуваке Данных) тогда Вы будете использовать сценарии и файлы DDL непосредственно. Выберите подход, зарегистрируйте его и следуйте за ним строго. Мне нравится иметь способность воссоздать базу данных в любой данный момент, таким образом, я предпочитаю иметь полный экспорт DDL всей базы данных (если я - DBA), или схемы разработчика (если я нахожусь в режиме разработки продукта).

7
ответ дан 24 November 2019 в 01:49
поделиться

Для Oracle я использую Жаба , который может вывести схему во многие дискретные файлы (например, один файл на таблицу). У меня есть некоторые сценарии, которые управляют этим набором в По необходимости, но я думаю, что это должно быть легко выполнимо в примерно любой системе управления версиями.

8
ответ дан EndangeredMassa 24 November 2019 в 01:49
поделиться

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

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

8
ответ дан Matthew Watson 24 November 2019 в 01:49
поделиться

При использовании SQL Server, было бы трудно избить Чувака Данных (иначе Выпуск Базы данных Visual Studio). Как только Вы приобретаете навык его, делание схемы выдерживает сравнение между управляемой версией Вашего источника базы данных, и версия в производстве является бризом. И щелчком можно генерировать различный DDL.

существует учебное видео на MSDN, это очень полезно.

я знаю о DBMS_METADATA и Жабе, но если бы кто-то мог бы придумать Чувака Данных для Oracle тогда, жизнь была бы действительно сладка.

9
ответ дан Perry Tribolet 24 November 2019 в 01:49
поделиться

Большинство механизмов базы данных должно поддерживать дамп Вашей базы данных в файл. Я знаю, что MySQL делает, так или иначе. Это просто будет текстовым файлом, таким образом, Вы могли утверждать, что к Подрывной деятельности, или независимо от того, что Вы используете. Было бы легко выполнить разность на файлах также.

10
ответ дан Ryan Fox 24 November 2019 в 01:49
поделиться

Я являюсь немного олдскульным, в этом я использую исходные файлы для создания базы данных. Существует на самом деле 2 файла - проект-database.sql и проект-updates.sql - первое для схемы и персистентных данных и второго для модификаций. Конечно, оба являются объектом управления исходным кодом.

, Когда база данных изменяется, я сначала обновляю основную схему в проекте-database.sql, затем копирую соответствующую информацию в проект-updates.sql, например, операторы ALTER TABLE. Я могу тогда применить обновления базы данных разработки, протестировать, выполнить итерации, пока не преуспели. Затем регистрация файлов, протестируйте снова и обратитесь к производству.

кроме того, у меня обычно есть таблица в дб - Конфигурации - такой как:

SQL

CREATE TABLE Config
(
    cfg_tag VARCHAR(50),
    cfg_value VARCHAR(100)
);

INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision:  

Затем я добавляю следующее к разделу обновления:

UPDATE Config SET cfg_value='$Revision:  

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

я мог сохранить обновления в их собственных отдельных файлах, но я принял решение делать пюре из них всех вместе и использовать cut& вставьте для извлечения соответствующих разделов. Немного больше обслуживания в порядке, т.е. удалите ':' от $ за 1,1$Revision для замораживания их.

WHERE cfg_tag='db_revision';

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

я мог сохранить обновления в их собственных отдельных файлах, но я принял решение делать пюре из них всех вместе и использовать cut& вставьте для извлечения соответствующих разделов. Немного больше обслуживания в порядке, т.е. удалите ':' от $ за 1,1$Revision для замораживания их.

), ( 'db_revision', '$Revision:

Затем я добавляю следующее к разделу обновления:

UPDATE Config SET cfg_value='$Revision:  

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

я мог сохранить обновления в их собственных отдельных файлах, но я принял решение делать пюре из них всех вместе и использовать cut& вставьте для извлечения соответствующих разделов. Немного больше обслуживания в порядке, т.е. удалите ':' от $ за 1,1$Revision для замораживания их.

WHERE cfg_tag='db_revision';

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

я мог сохранить обновления в их собственных отдельных файлах, но я принял решение делать пюре из них всех вместе и использовать cut& вставьте для извлечения соответствующих разделов. Немного больше обслуживания в порядке, т.е. удалите ':' от $ за 1,1$Revision для замораживания их.

);

Затем я добавляю следующее к разделу обновления:

UPDATE Config SET cfg_value='$Revision:  

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

я мог сохранить обновления в их собственных отдельных файлах, но я принял решение делать пюре из них всех вместе и использовать cut& вставьте для извлечения соответствующих разделов. Немного больше обслуживания в порядке, т.е. удалите ':' от $ за 1,1$Revision для замораживания их.

WHERE cfg_tag='db_revision';

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

я мог сохранить обновления в их собственных отдельных файлах, но я принял решение делать пюре из них всех вместе и использовать cut& вставьте для извлечения соответствующих разделов. Немного больше обслуживания в порядке, т.е. удалите ':' от $ за 1,1$Revision для замораживания их.

30
ответ дан Josh Leitzel 24 November 2019 в 01:49
поделиться

Смотрите на пакет оракула DBMS_METADATA.

, В частности, следующие методы особенно полезны:

  • DBMS_METADATA.GET_DDL
  • DBMS_METADATA.SET_TRANSFORM_PARAM
  • DBMS_METADATA.GET_GRANTED_DDL

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

Не уверенный, если существует что-то это простое для MSSQL.

8
ответ дан CoderCroc 24 November 2019 в 01:49
поделиться

Я настоятельно рекомендую дельта SQL . Я просто использую его для генерации сценариев различий, когда я закончу кодирование своей функции и проверю эти сценарии в моем инструменте управления версиями (Mercurial :))

У них есть как SQL-сервер, так и версия Oracle.

11
ответ дан 24 November 2019 в 01:49
поделиться

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

http://www.red-gate.com/products/schema_compare_for_orcle/index.htm

3
ответ дан 24 November 2019 в 01:49
поделиться

MyBatis (ранее iBatis) имеет миграцию схемы, инструмент для использования в командной строке. Он написан на java, но может быть использован в любом проекте.

Чтобы достичь хорошей практики управления изменениями в базе данных, нам необходимо определить несколько ключевых целей. Таким образом, система миграции схем MyBatis (или сокращенно MyBatis Migrations) стремится:

  • Работать с любой базой данных, новой или существующей
  • Использовать систему контроля исходных текстов (например. Subversion)
  • Позволить параллельным разработчикам или командам работать независимо
  • Позволить конфликтам быть очень заметными и легко управляемыми
  • Позволить миграцию вперед и назад (evolve, devolve соответственно)
  • Сделать текущее состояние базы данных легко доступным и понятным
  • Позволить миграции, несмотря на привилегии доступа или бюрократию
  • Работать с любой методологией
  • Поощрять хорошую, последовательную практику
12
ответ дан 24 November 2019 в 01:49
поделиться

Интересно, что никто не упомянул инструмент с открытым исходным кодом liquibase, который основан на Java и должен работать почти с каждой базой данных, поддерживающей jdbc. По сравнению с rails он использует xml вместо ruby для выполнения изменений схемы. Хотя мне не нравится xml для языков, специфичных для домена, очень крутое преимущество xml в том, что liquibase умеет откатывать определенные операции, например

<createTable tableName="USER"> 
   <column name="firstname" type="varchar(255)"/>
</createTable>

Так что вам не нужно делать это самостоятельно

Также поддерживаются чистые sql-запросы или импорт данных.

11
ответ дан 24 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: