Как обновить производственную базу данных приложений turbogears

У меня есть производственная база данных postgres в производстве (которая содержит много данных). теперь мне нужно изменить модель tg-app, чтобы добавить пару новых таблиц в базу данных.

Как мне это сделать? Я использую sqlAlchemy.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
859
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вы просто добавляете таблицы и не изменяете ни одну из таблиц, в которых есть существующие данные, вы можете просто добавить новые определения таблиц sqlAlchemy в model.py и запустить:

tg-admin sql create

Это не перезапишет ни одну из ваших существующих таблиц.

Для миграции схемы вы можете взглянуть на http://code.google.com/p/sqlalchemy-migrate/, хотя я сам еще не использовал его.

Перед миграцией всегда делайте резервную копию производственной базы данных.

Самый простой подход - просто написать несколько сценариев обновления sql и использовать их для обновления базы данных. Очевидно, что это довольно низкоуровневый (так сказать) подход.

Если вы думаете, что будете делать это много, и хотите придерживаться Python, возможно, вам стоит взглянуть на sqlalchemy-migrate. Об этом была статья в недавнем журнале Python Magazine.

Ответ принят как подходящий

Это всегда работает и требует небольшого размышления - только терпения.

  1. Сделайте резервную копию.

  2. Собственно сделайте резервную копию. Все пропускают шаг 1, думая, что у них есть резервная копия, но они никогда не могут ее найти или поработать с ней. Не доверяйте никаким резервным копиям, из которых нельзя восстановить.

  3. Создайте новую схему базы данных.

  4. Определите вашу новую структуру с нуля в новой схеме. В идеале вы должны запустить сценарий DDL, который строит новую схему. Нет сценария для построения схемы? Создайте его и поставьте под контроль версий.

    С помощью SA вы можете определять свои таблицы, и он может построить вашу схему за вас. Это идеальный вариант, поскольку ваша схема находится под контролем версий в Python.

  5. Перенести данные.

    а. Для таблиц, структура которых не изменилась, переместите данные из старой схемы в новую с помощью простых операторов INSERT / SELECT.

    б. Для таблиц, структура которых изменилась, разработайте сценарии INSERT / SELECT для перемещения данных из старых в новые. Часто это может быть один оператор SQL для каждой новой таблицы. В некоторых случаях это должен быть цикл Python с двумя открытыми соединениями.

    c. Для новых таблиц загрузите данные.

  6. Прекратите использовать старую схему. Начните использовать новую схему. Найдите все программы, которые использовали старую схему, и исправьте конфигурацию.

    Нет списка приложений? Сделай один. Серьезно - это важно.

    Приложения имеют жестко запрограммированные конфигурации БД? Исправьте и это, пока вы занимаетесь этим. Либо создайте общий файл конфигурации, либо используйте некоторую общую переменную среды или что-то еще, чтобы (а) обеспечить согласованность и (б) централизовать понятие «производство».

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

OP упоминает, что у него «много данных»: это может сделать цикл выбора / вставки непрактичным, если это означает часы или дни медлительности, простоя или потери данных. Вместо этого, можете ли вы выполнить репликацию с ведущего устройства со старой конфигурацией на ведомое устройство с новой?

James Brady 24.12.2008 03:15

Цикл "выбор-вставка" с одним оператором SQL - это самый быстрый способ перемещения данных. Любая операция с базой данных, которая требует (а) перемещения данных и (б) абсолютной гарантии отсутствия простоев, должна выполняться таким образом. В противном случае просто добавьте таблицу.

S.Lott 24.12.2008 04:02

В целом согласен с Джон. Однопроходный ВЫБОР и ВСТАВКА не подходят для большой базы данных, а настройка репликации или многопроходных дифференциальных операций ВЫБОР / ВСТАВКА, вероятно, будет сложнее и более подвержена ошибкам.

Лично я использую SQLAlchemy как ORM под TurboGears. Чтобы выполнить миграцию схемы, я запускаю:

tg-admin sql status

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

Для тех, кто использует автономный SQLAlchemy (то есть не в TurboGears), функциональность sql status довольно проста и может быть найдена здесь, в источнике TG: http://svn.turbogears.org/branches/1.1/turbogears/command/sacommand.py (в ветке 1.0 также есть версии для более старых версий Python / SA).

Другие вопросы по теме