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

问题描述:

我使用:使用PHP移动数据的Postgres到MySQL/Laravel5

  • 本地的Postgres数据库
  • Laravel 5与MySQL数据库也是当地
  • 的Postgres数据库包含OTRS表结构 - 在桌上有超过91.000行“门票”

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

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

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

澄清:

  • MySQL的门票表包含91397行和5列
  • Postgres的门票表还具有91397行和6列
  • 我创建上Laravel(MySQL的)迁移所添加的额外的列(虽然它是空的)

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

link

+0

您是否想使用Laravel将列添加到现有模式? –

+0

@AliGajani我会更新帖子来澄清。 – Thaenor

+0

既然这些都在你的机器上,那么这是一次性的举动吗?或者你在开发一个可重复的流程来使用雄辩移动数据? – Stradas

你可以用雄辩来做到这一点。以下是我该怎么做(未经测试,可能需要一些调整):

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

所以基本上:

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

同为M2具有不同$connection

现在在你的控制器方法或无论你执行你的代码,你可以查询块用雄辩:

//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(); 
    } 
}); 

我觉得这样做的工作,你可以测试这个?

+0

谢谢你的回答。一旦我可以测试这个,我会发布一些反馈。 – Thaenor

+0

如果其中一个数据库具有不同的表结构,该怎么办? – Thaenor

+0

我认为这不重要。如果它是不同的表名,只需设置'table'字符串。如果有不存在的列,雄辩会忽略它们。 – hfingler