2011-01-12 3 views
0

Я использую Rails 2.3.5 с ActiveRecord, рубином 1.8.6, MySQL (2.8.1)Объединение два таблиц рельсов пути

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

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

A = A + B

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

+0

Я знаю, что большинство новичков в Rails не признают разницу, но правильно ли я предполагаю, что вы используете ActiveRecord с Rails, а не какой-либо другой ORM, такой как Sequel или DataMapper? – Phrogz

+0

Да, я использую ActiveRecord с Rails – Tommy

ответ

1

Чтобы навсегда скопировать содержимое одной таблицы в другую, вам понадобится вариант синтаксиса запроса INSERT. Вы не указываете, какие RDBMS вы используете, поэтому я просто расскажу, как он будет работать с 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

Хм это вопрос новичков. Что делать, если таблицы находятся в разных базах данных? – Tommy

+1

Нет проблем, просто укажите его как «INSERT DB1.A SELECT * FROM DB2.B' .., который предполагает, что вы имеете в виду разные базы данных * на одном сервере *. – noodl

+0

Да, это хорошо ... что, если они на разных серверах? – Tommy

2

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

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

SELECT * FROM table_a 
UNION 
SELECT * FROM table_b; 

В приложении Rails:

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

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

UPDATE: Так как вы хотите, чтобы сделать эти изменения на постоянной основе, вы должны создать миграцию, которая объединит две таблицы вместе. Это позволит убедиться, что 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 приведет к конфликтующим основным идентификаторам.

+0

Я думаю, что он хочет сделать 'INSERT SELECT ...', чтобы конкатенация таблиц постоянно, а не просто« присоединяться »к ним в запросе. – noodl

+0

Спасибо! Я столкнулся с какими-либо проблемами, если у меня есть миллионы записей в каждой таблице? – Tommy

+0

И да, я хочу постоянно конкатенировать таблицы. – Tommy

0

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

Смежные вопросы