1

我有一个使用 MySQL 的 Rails 应用程序。应用程序需要填充 sqlite 数据库,以便从主 mysql 数据库分发到客户端应用程序。sqlite 数据库的架构与 mysql 数据库非常相似,但并不完全相同。sqlite 数据库将使用存储在主 mysql 数据库中的模式和数据的子集填充。数据子集将由 http 请求中传递的参数确定。这不是作为维护操作,而是将 mysql db 的子集作为 sqlite db 交付给客户端应用程序。

我正在考虑尝试修改水龙头或使用续集编写金属应用程序以连接到两个数据库以传输数据。

任何其他建议将不胜感激?

4

4 回答 4

2

免责声明:我是 Sequel 的维护者。

续集可能是最简单的方法。bin/sequel 工具可以将 MySQL 数据库复制到 SQLite 数据库,因此,如果您查看源代码(http://github.com/jeremyevans/sequel/blob/205d8a04842c143736de76d645a2a955a1ca641f/bin/sequel),您可以获得关于如何用 Sequel 做到这一点的想法。

由于事物的构造方式,直接复制模式可能最简单,然后删除不需要的列。或者,我只需编写代码来创建我想要的 SQLite 数据库模式。

复制数据的代码可能会使用 bin/sequel 中的修改版本。

于 2009-08-17T16:37:13.380 回答
1

如果您在两个数据库上使用类似的模型,您应该注意到 ActiveResource 的“attributes”方法返回该模型属性的散列,并且“attributes=”接收属性散列(它不必包括所有模型的属性)。记住这一点,您可以利用 ActiveRecord::Base.establish_connection 方法让两个模型连接到不同的数据库。这样你就可以做类似的事情:

MysqlModel.establish_connection(YAML.load_file(path_to_database_yml))
SqliteMode.establish_connection(YAML.load_file(path_to_other_database_yml))

MysqlModel.all.each do |m|
  SqliteModel.create(m.attributes)
end

如果模型不共享所有字段,或者在将其分配给 Sqlite 模型之前需要进行一些处理,则可以构建一个接收原始属性散列并对其进行处理以返回 Sqlite 模型的正确属性散列的方法。

于 2009-08-17T05:10:50.617 回答
0

您的 Rails 应用程序是为客户按需创建 sqlite 数据库,还是这个过程是带外维护工作?

如果这是一项维护工作,我会编写一个 shell 脚本来转储 mysql 数据库,对转储进行任何替换以使其特定于 sqlite,最后将其导入到 sqlite 数据库。

于 2009-08-15T17:27:48.890 回答
0

也许您可以尝试yaml_db 插件,因为它使用 rake 任务,您可以添加一个 cron 来执行此操作:

rake db:data:dump RAILS_ENV=production && rake db:data:load RAILS_ENV=lite

设置使用 sqlite db 的“lite”环境。

我也猜想如果您想对数据进行一些修改,您可以稍微修改一下插件。

于 2009-08-16T03:27:51.773 回答