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






Если вы просто добавляете таблицы и не изменяете ни одну из таблиц, в которых есть существующие данные, вы можете просто добавить новые определения таблиц sqlAlchemy в model.py и запустить:
tg-admin sql create
Это не перезапишет ни одну из ваших существующих таблиц.
Для миграции схемы вы можете взглянуть на http://code.google.com/p/sqlalchemy-migrate/, хотя я сам еще не использовал его.
Перед миграцией всегда делайте резервную копию производственной базы данных.
Самый простой подход - просто написать несколько сценариев обновления sql и использовать их для обновления базы данных. Очевидно, что это довольно низкоуровневый (так сказать) подход.
Если вы думаете, что будете делать это много, и хотите придерживаться Python, возможно, вам стоит взглянуть на sqlalchemy-migrate. Об этом была статья в недавнем журнале Python Magazine.
Это всегда работает и требует небольшого размышления - только терпения.
Сделайте резервную копию.
Собственно сделайте резервную копию. Все пропускают шаг 1, думая, что у них есть резервная копия, но они никогда не могут ее найти или поработать с ней. Не доверяйте никаким резервным копиям, из которых нельзя восстановить.
Создайте новую схему базы данных.
Определите вашу новую структуру с нуля в новой схеме. В идеале вы должны запустить сценарий DDL, который строит новую схему. Нет сценария для построения схемы? Создайте его и поставьте под контроль версий.
С помощью SA вы можете определять свои таблицы, и он может построить вашу схему за вас. Это идеальный вариант, поскольку ваша схема находится под контролем версий в Python.
Перенести данные.
а. Для таблиц, структура которых не изменилась, переместите данные из старой схемы в новую с помощью простых операторов INSERT / SELECT.
б. Для таблиц, структура которых изменилась, разработайте сценарии INSERT / SELECT для перемещения данных из старых в новые. Часто это может быть один оператор SQL для каждой новой таблицы. В некоторых случаях это должен быть цикл Python с двумя открытыми соединениями.
c. Для новых таблиц загрузите данные.
Прекратите использовать старую схему. Начните использовать новую схему. Найдите все программы, которые использовали старую схему, и исправьте конфигурацию.
Нет списка приложений? Сделай один. Серьезно - это важно.
Приложения имеют жестко запрограммированные конфигурации БД? Исправьте и это, пока вы занимаетесь этим. Либо создайте общий файл конфигурации, либо используйте некоторую общую переменную среды или что-то еще, чтобы (а) обеспечить согласованность и (б) централизовать понятие «производство».
Вы можете делать такую процедуру в любое время, когда делаете серьезную операцию. Он никогда не касается старой базы данных, кроме как для извлечения данных.
Цикл "выбор-вставка" с одним оператором SQL - это самый быстрый способ перемещения данных. Любая операция с базой данных, которая требует (а) перемещения данных и (б) абсолютной гарантии отсутствия простоев, должна выполняться таким образом. В противном случае просто добавьте таблицу.
В целом согласен с Джон. Однопроходный ВЫБОР и ВСТАВКА не подходят для большой базы данных, а настройка репликации или многопроходных дифференциальных операций ВЫБОР / ВСТАВКА, вероятно, будет сложнее и более подвержена ошибкам.
Лично я использую 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).
OP упоминает, что у него «много данных»: это может сделать цикл выбора / вставки непрактичным, если это означает часы или дни медлительности, простоя или потери данных. Вместо этого, можете ли вы выполнить репликацию с ведущего устройства со старой конфигурацией на ведомое устройство с новой?