使用dump sql文件中的数据填充rails应用程序

时间:2015-06-12 09:48:24

标签: sql database

我想将数据库导入rails app, 我有一个我的数据库的转储文件:

*!40000 ALTER TABLE `client` DISABLE KEYS */;
INSERT INTO `client` (`Id`,`ClientTypeId`,`Name`,`Address`,`Mobile`,`Phone`,`Fax`,`Email`,`ContactName`,`ContactMobile`,`ContactEmail`) VALUES 
 (69,1,'ФК Астана','БЦ Москва;-;-','72-99-50, 72-99-49','72-99-50, 72-99-49','72-99-50, 72-99-49','alima_fcast@mail.ru','Алима','610-291','alima_fcast@mail.ru'),
 (70,1,'Береке Каб','13 магистраль;-;-','965-094','965-094','965-094','d.nurmoldin@bkab.kz','Дидар','+77015145781','d.nurmoldin@bkab.kz'),
 (71,1,'Канам Агро','БЦ Астаналык ;3 этаж;3 этаж','500-000','500-000','-','a.tulubaeva@canam.kz','Асемгуль','',''),

实际列表当然更长。有没有办法将这个INSERT语句放在rails app中的某个地方并为我的数据库设定种子。

假设我有客户端模型。 在我的开发环境中,我使用sqlite,数据从mysql数据库中转储。

1 个答案:

答案 0 :(得分:0)

我最近将我的生产数据库从PHP / mySQL迁移到Ruby on Rails / Postgres。对于后台,我使用Rails / NGINX在Digital Ocean服务器上运行我的Unicorn应用程序。

基本上,我一直在寻找一种很好的数据库中立方法,我不需要担心数据库的特性,但能够保留我的所有数据。我花了好几个小时尝试使用YAML进行迁移,但它导致了一个接一个的问题,尽管有很多自定义数据按摩sedperl等等。有人在SO上建议我试试看,我搬到了CSV,我的生活得到了极大的改善。

从mySQL导出

我使用phpMyAdmin来管理源系统中的mySQL数据库。这些是我导出数据的步骤:

  1. 使用.htaccess中的重写规则创建一个简单的维护页面并将所有网站流量路由到该页面。
  2. 备份生产数据库(我使用此备份来完成所有工作)。
  3. 操纵源数据以匹配目标系统上的列(仅在架构已更改时才需要)。
  4. 一次导出到CSV一个表。我使用制表符分隔符,双引号作为引号并引用特殊字符,因为它们在Postgres中以这种方式使用,并且没有替换所有NULL。我还从数据中删除了所有换行符,因为我认为这会增加迁移的复杂性并且删除它们不会对我的客户数据产生重大影响。
  5. 将数据复制到目标服务器。我实际上分两步完成了这一步 - 首先使用Cloud9的文件上传到我的Cloud9 IDE帐户,然后使用scp从那里到我的服务器(类似scp -P 1234 table.txt user@10.20.30.40:/tmp)。
  6. <强>变换

    1. 添加时间戳列。在我的情况下,我的表并没有全部都有它们,并且它们在Rails中被期待(显然是非常好的)。我实际上在我的源系统上进行了这种转换,但是我可以在此过程中为每个记录轻松添加两个日期字段。这就是我使用制表符分隔符的原因 - 这样我就可以轻松地将文件作为文本导入Excel并添加这两列。
    2. sed -i 's/\t/,/g' table.txt - 用逗号替换所有标签。
    3. sed -i 's/\\//g' table.txt - 删除所有反斜杠(我在PHP反斜杠地狱中的剩余时间了。)
    4. perl -i -pe 's/[^[:ascii:]]//g' table.txt - 删除非ASCII字符。
    5. <强>加载

      1. 我以前通过定期部署和迁移在我的生产服务器上创建了所有表。
      2. 在Postgres中为每个表运行truncate table;以删除测试数据。
      3. 在Postgres中为每个表运行\COPY table FROM '/tmp/table.txt' DELIMITER ',' CSV;以将其加载到生产中。
      4. 在Postgres中为每个表运行select count(id) from table;,并确保该数字与原始行数匹配。
      5. 在Postgres中运行select setval('table_id_seq', (select max(id) FROM table));以重置Postgres自动增量计数器。
      6. 最后一步是因为一个讨厌的小惊喜学习而添加的。当我迁移我的表时,他们中的大多数都缺少遗留数据的唯一ID。当数据迁移到Postgres时,默认情况下它会以最低的可用ID号开始自动递增。这样可以正常工作,直到可用数字块用完为止,并且您的应用程序无法插入重复键错误。

        这就是它。我遇到了其他问题,但通常没有严格的数据迁移相关。

        在切换和上线之前,我还测试了大部分或全部这个过程大约三次。我强烈建议尽可能经常进行测试,并让友好的用户查看迁移的数据并在预生产中使用该系统。当然,mo数据是mo问题,因此YMMV取决于数据集的大小。

        希望这能提供一些帮助 - 如果您有疑问,请告诉我。