【问题标题】:Best way to import data into my new rails app?将数据导入我的新 Rails 应用程序的最佳方式?
【发布时间】:2014-05-06 15:36:51
【问题描述】:

您好,我有一个 sqlite3 数据库,其中包含我以前版本的 Web 应用程序中的数据,这些数据不是用 Rails 编写的。我现在从头开始重写 Rails 中的 Web 应用程序。但我想在新的 rails 应用程序中使用我以前的应用程序中的数据。实现这一目标的最佳方法是什么?

这是我迄今为止尝试过的,但效果不佳: 1) 我创建了一个新的 Rails 应用程序

2) 将新应用中的 sqlite3 数据库替换为旧应用中的 sqlite3 数据库

3) 创建了一个与旧数据库具有相同架构的模型。

4) 使用更新的 DB 文件详细信息更改了 databse.yml 文件

5) 我的模型添加了“建立连接”方法

6) 我可以让它在我的浏览器@"index.html" 中显示旧数据库的所有详细信息

7) 但是,当我想在数据库中插入/编辑记录时遇到了问题。由于数据库没有每一行的主键列,所以它不起作用。

8) 所以我尝试进行迁移以添加具有主键的列。它没有工作

9) 突然一个新的 development.sqlite3 数据库出现在应用程序中,它正在尝试向新数据库添加主键。

10) 所以我只是删除了弹出的新数据库,然后应用程序无法运行

11) 现在我想从头开始,所以我的问题是: “将数据从以前的非 Rails 应用程序(以 sqlite3 DB 格式)导入新的 Rails 应用程序的最佳方法是什么?”

【问题讨论】:

  • 可以使用旧版数据库,但我们无法为您提供帮助,除非您提供有关您的短语的详细信息,例如“遇到问题”和“没有工作”。跨度>
  • 您也可以稍后使用 gem github.com/igorkasyanchuk/rails_db为您的应用导入 SQL

标签: ruby-on-rails ruby


【解决方案1】:

您想使用 2 个数据库,旧的和新的。所以,你的 database.yml 需要有 2 个连接。一个应该是您的正常连接,称为开发或生产,另一个应该称为遗留。填写他们的不同连接信息。默认情况下,您的 ActiveRecord 模型将从不称为 legacy 的模型中提取。

创建一个名为 LegacyBase 的模型。在模型中输入establish_connection "legacy"。现在在 app/models/legacy 创建一个目录。将所有模型表示来自 old DB 的数据放在此目录中。所有这些模型都应该从 LegacyBase 扩展而来。这意味着他们都在从旧数据库中读取数据。

创建您的新模型。你想让他们有一个主键列吗?如果没有,请参阅此答案。 Create an ActiveRecord database table with no :id column?。不过,默认情况下它们会有一个 id 列,我建议保留它。

对于每个遗留模型,编写一个名为 to_model 的方法。在此方法中,编写创建新对象的代码,并用旧数据填充它并保存它。像这样的:

class OldUser < LegacyBase

    establish_connection "legacy"

    def to_model
        User.create!(self.attributes)
    end
end

您可以执行任何需要发生的逻辑来使旧数据适合您的新应用。在OldUser.all.map(&amp;:to_model)等所有旧记录上调用此方法。

对所有要移动的表执行此操作。

【讨论】:

  • 感谢您的详细回答。对此,我真的非常感激。为了完成一些基本的工作,我在 Rails 上苦苦挣扎了几天。
  • 这对你有用吗?我有问题。我得到一个:未初始化的常量 LegacyBase (NameError)。是否有更完整的描述如何创建子模型以及放置它们的位置?甚至是示例代码?
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多