使用PHP / Laravel5将数据Postgres移动到MySQL

时间:2015-05-29 11:23:40

标签: php mysql database postgresql laravel-5

我正在使用:

  • 本地Postgres DB
  • Laravel 5,MySQL DB也是本地的
  • Postgres DB包含来自OTRS的表结构 - 表“门票”上有超过91.000行

我需要将数据从一个数据库移动到另一个数据库。我所做的是编译一个大型查询,将我需要的所有数据联合起来并在我在Laravel结构中创建的PHP脚本中运行它。然后我使用Eloquent迭代结果插入MySQL。我知道这很糟糕,但为了做到这一点,我不得不删除PHP的内存和时间限制,虽然花了很长时间,但它确实有效!

现在我意识到我错过了一些东西,我需要重新运行类似的查询(产生相同数量的行),但这次只是在MySQL DB上添加一个字段。

我的问题是,如何优化此流程?我正在考虑使用块,但我不知道如何使用块。

澄清:

  • MySql的Tickets表包含91397行和5列
  • Postgres Tickets表还有91397行和6列
  • 我在Laravel(MySQL)上创建了一个迁移,添加了额外的列(尽管它是空的)

如果我向您展示我的代码,可能会更容易。

link

1 个答案:

答案 0 :(得分:2)

您可以使用eloquent来执行此操作。以下是我的工作方式(未经测试,可能需要进行一些调整):

config\database.php中设置两个数据库连接。  为同一资源制作两个模型(您只能使用一个模型,但我不愿意),我将它们命名为M1M2,具有不同的连接属性。为此,请在模型中创建一个属性:protected $connection = 'connection_name'

基本上是这样的:

class M1 extends Model {
   protected $connection = 'connection_name';
   protected $table = 'table_name';
   protected $guarded = [];

具有不同$connection的M2相同。

现在,在您的控制器方法或您执行代码的任何地方,您都可以使用雄辩的方式查询查询:

//assuming you are transferring M1's db to M2's

M1::chunk(200, function($m1s)  //if you wanna use only one model, this should be M1::on('connection-name')->chunk(...
{
   foreach ($m1s as $m1)
   {
      $m2 = new M2();
      //this does not copy model-specific attributes like $connection
      $m2->fill( $m1->getAttributes() );  
      $m2->save();
   }
});

我认为这样做,你能测试一下吗?