使用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的)迁移所添加的额外的列(虽然它是空的)
如果我向您展示我的代码,可能会更容易。
答
你可以用雄辩来做到这一点。以下是我该怎么做(未经测试,可能需要一些调整):
在config\database.php
中设置两个DB连接。 为相同的资源创建两个模型(您只能使用一个模型,但我宁愿不使用),我将其命名为M1
和M2
,具有不同的连接属性。为此,请在模型中创建一个属性: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();
}
});
我觉得这样做的工作,你可以测试这个?
您是否想使用Laravel将列添加到现有模式? –
@AliGajani我会更新帖子来澄清。 – Thaenor
既然这些都在你的机器上,那么这是一次性的举动吗?或者你在开发一个可重复的流程来使用雄辩移动数据? – Stradas