所以我正在构建一个新的应用程序,它需要从旧应用程序中导入一些遗留数据。旧的应用程序数据库是mysql,你显然不能在heroku上使用它,但我想使用postgres。基本上,我通过activerecord进行ETL。
到目前为止,我拥有的是:
# config/initializers/legacy_database.rb
LEGACY_DATABASE_URL = "mysql://myusername:#{ENV['LEGACY_DATABASE_PASSWORD']}@host/foo1008801154002"
# app/models/legacy.rb
class Legacy < ActiveRecord::Base
establish_connection LEGACY_DATABASE_URL
end
# app/models/legacy/user.rb
class Legacy::User < Legacy
self.table_name = 'users'
end
如果我在控制台中运行Legacy::User.count
,我会返回正确的计数。然而,如果我尝试做类似Legacy::User.first
的事情,我会得到以下错误:
Legacy::User Load (54.0ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
Mysql::Error: Table 'foo1008801154002.legacies' doesn't exist: SHOW FULL FIELDS FROM `legacies`
ActiveRecord::StatementInvalid: Mysql::Error: Table 'foo1008801154002.legacies' doesn't exist: SHOW FULL FIELDS FROM `legacies`
我不知道rails为什么要在.legacies
上添加到表名中,也不知道如何解决这个问题。我想这可能是Legacy.connection
中的一些设置
有什么建议吗?
这相对简单。我不得不将行self.abstract_class = true
添加到我的Legacy基类中。
请注意:如果您的捆绑包中有mysql2-gem,则需要放入:
# config/initializers/legacy_database.rb
LEGACY_DATABASE_URL = "mysql2://myusername:#{ENV['LEGACY_DATABASE_PASSWORD']}@host/foo1008801154002"
(或在Gemfile中加载mysql-gem)