Как объединить две базы данных с одинаковой схемой, которые находятся на Heroku? - PullRequest
2 голосов
/ 23 июля 2010

Я создал два приложения, которые были практически идентичны по героку.Они начинали по-другому, потому что я тестировал загрузку на heroku и испытывал некоторые трудности с внесением корректировок.

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

Похоже, мне нужно его локально отключить и объединить, но не совсем понятно, как это сделать.Сделал несколько поисков в Google, но ничего не получилось.

Мне нужна пошаговая помощь, у меня нет четкого процесса.

1) У меня естьдва приложения на героку, где у меня есть базы данных.У них одинаковые схемы;

2) Мне не нужно знать, откуда поступили данные: мне просто нужно, чтобы все это находилось в одной базе данных

3) Я бы хотелбыть в состоянии сделать это с определенными командами sql, в отличие от ручного открытия (не знаю, как я это сделаю) и последующего просмотра, поскольку существует около 10 различных взаимосвязанных таблиц.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 04 августа 2010

Если вам не нужно удалять дубликаты, вы можете сделать это для каждой таблицы

insert into db1.tablea
select * from db2.tablea ;

Некоторые осложнения:

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

Вот быстрый и грязный способ сделать это:

  • Найти самый высокий идентификатор в таблице любой в первой базе данных.
  • Назовите это max_key_db1.
  • Затем обновите все ключи во второй базе данных, чтобы они были current_value плюс max_key_db1.

Обратите внимание, что вам нужно обновить как первичные, так и внешние ключи, чтобы это работало, например ::

update db2.tablea set id = id + max_key_db1, foreign_id = foreign_id + max_key_db1;
update db2.tableb set id = id + max_key_db1, a_id = a_id + max_key_db1;
etc.

Теперь у вас есть самосогласованный db2 со всеми ключами (первичными и внешними) со значениями, которых нет в db1; другими словами, ваши ключи уникальны в обеих базах данных.

Теперь вы можете вставить строки из db2 в db1:

insert into db1.tablea
select * from db2.tablea ;

Обратите внимание, что не будет работать, если таблицы, вставленные в них, создают свои собственные идентификаторы, используя автоинкремент или триггеры; в этом случае вам придется явно указать ciolumns и отключить все автоматически генерируемые идентификаторы:

insert into db1.tablea( id, foreign_id, col1, ...)
select id, foreign_id, col1 from db2.tablea ;

Кроме того, вы можете оставить db2 без изменений, выполнив все это за один шаг для каждой таблицы:

insert into db1.tablea( id, foreign_id, col3, col4)
select id + max_key_db1, foreign_id + max_key_db1, col3, col4 from db2.tablea ;

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

Теперь, поскольку вы использовали самый высокий ключ в db1 независимо от таблицы, вероятно, ваши идентификаторы не будут последовательными, но кого это волнует? Ключи - это ключи. Что вам нужно будет сделать, это сбросить любой auto_increment или последовательность для каждой таблицы, чтобы следующий автоматически сгенерированный ключ был выше, чем самый высокий ключ в этой таблице. Как это сделать, зависит от того, какую СУБД вы используете.

2 голосов
/ 29 июля 2010

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

Вы можете использовать встроенные инструменты Heroku, чтобы получить дамп стола. Сначала загрузите и импортируйте данные в базу данных, а затем выгрузите их в текстовый файл (формат SQL).

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

Есть несколько ошибок, с которыми вы можете столкнуться:

  • Если вы сгенерировали ключи для записей - что вы, вероятно, делаете - тогда вам придется перенумеровать их в наборе данных, который вы импортируете. Может быть способ экспортировать их без сгенерированных ключей, но я использовал быстрый grep для перенумерации их за пределы диапазона базы данных, в которую я сливаюсь.
  • Если в других таблицах есть ссылки на эти ключи (как внешние ключи), вам также придется перенумеровать их.
  • Некоторые таблицы могут быть «справочными таблицами» и одинаковыми в обеих системах, поэтому вы можете пропустить их импорт.
  • Некоторые таблицы могут не нуждаться в объединении.

Как только вы получите текстовый файл в хорошем состоянии, запустите его локально и проверьте его. Если это все испортило, не беспокойтесь - просто загрузите производственные данные (те, в которые вы импортируете) и попробуйте снова. Повторяйте, пока у вас все не будет хорошо работать локально. Затем загрузите файл в heroku.

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

0 голосов
/ 28 сентября 2010

Если вам нужно сделать это только один раз, вы можете легко это сделать, используя ms access.

Вы можете решить любой конфликт, создав какой-либо запрос в визуальном конструкторе запросов.

Вы можете подключиться к базе данных sqlite3 с помощью драйвера odbc для sqllite3 и связать эти таблицы при доступе.

0 голосов
/ 28 сентября 2010

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

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