Слияние двух таблиц рельсами - PullRequest
0 голосов
/ 13 января 2011

Я использую Rails 2.3.5 с ActiveRecord, ruby ​​1.8.6, mysql (2.8.1)

У меня есть две таблицы A и B с точно такими же структурами столбцов.A находится на отдельном сервере от B.

Я хочу взять все содержимое B и добавить его к A, так что

A = A + B

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

Ответы [ 3 ]

2 голосов
/ 13 января 2011

Вы можете сделать это в двух местах, в своем SQL или в вашем приложении.

Через запрос SQL:

SELECT * FROM table_a
UNION
SELECT * FROM table_b;

В вашем приложении Rails:

a = A.all
b = B.all
ab = a + b

Достаточно просто.

ОБНОВЛЕНИЕ: Поскольку вы хотите сделать это изменение навсегда, вы должны создать миграцию, которая объединит две таблицы вместе.Это позволит Rails знать, что происходит, и позволит вам перенастроить вашу производственную базу данных аналогичным образом.Поскольку ActiveRecord не имеет встроенной таблицы слияния, вы должны выполнить необработанный SQL-запрос в своей миграции следующим образом:

class MergeTableAWithTableB < ActiveRecord::Migration
  def self.up
    execute "INSERT INTO `table_a` (field_1, field_2, field_3) SELECT (field_1, field_2, field_3) FROM `table_b`;"
    drop_table :table_b
  end

  def self.down
    raise IrreversibleMigration
  end
end

Затем запустите rake db:migrate в командной строке, чтобы выполнить это действие.

Это дает эффект повторного индексирования строк из table_b, так как перемещение их в table_a приведет к конфликту первичных идентификаторов.

1 голос
/ 13 января 2011

Для постоянного копирования содержимого одной таблицы в другую вам потребуется изменение синтаксиса запроса INSERT. Вы не указываете, какую СУБД вы используете, поэтому я просто покажу, как она будет работать с MySQL.

INSERT A SELECT * FROM B

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

EDIT

Если ваши таблицы размещены на отдельных серверах, вам нужно скопировать один из них, чтобы они находились в одном экземпляре MySQL. Это можно сделать с помощью команд mysqldump и mysql, например:

mysqldump -h <hostname> <database_name> <table_name> |mysql -h <other_hostname> <other_database_name>

или, если вы предпочитаете использовать ssh

ssh <hostname> mysqldump <database_name> <table_name> |ssh <other_hostname> mysql <other_database_name>
0 голосов
/ 13 января 2011

Похоже, ActiveRecord (в отличие от Sequel ) не поддерживает пакетную вставку по умолчанию.Посмотрите на этот ответ о переполнении стека для библиотеки, которая расширяет ActiveRecord, так что вы можете сделать одно эффективное обновление, а не одну вставку SQL для каждой строки.

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