【问题标题】:Moving data Postgres to MySQL using PHP/Laravel5使用 PHP/Laravel5 将数据 Postgres 移动到 MySQL
【发布时间】:2015-05-29 11:23:39
【问题描述】:

我正在使用:

  • 本地 Postgres 数据库
  • 具有本地 MySQL 数据库的 Laravel 5
  • Postgres DB 包含来自 OTRS 的表结构 - 表“tickets”上有超过 91.000 行

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

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

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

澄清一下:

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

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

link

【问题讨论】:

  • 你想使用 Laravel 向现有架构添加列吗?
  • @AliGajani 我会更新帖子以澄清。
  • 既然这些都在你的机器上,是一次性的吗?或者您是否正在开发一个使用 Eloquent 移动数据的可重复流程?
  • @Stradas 实际上都是。远程服务器中有一个生产数据库。意识到这一点后,我调整了我的代码,因此我不会获取所有 90k 行,而只会获取最后 100 行。每当我部署它时,它都会从它的最后一个已知 id 同步并与远程生产服务器“赶上速度”。

标签: php mysql database postgresql laravel-5


【解决方案1】:

您可以使用 eloquent 来执行此操作。这是我的做法(未经测试,可能需要一些调整):

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

所以基本上:

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

对于 M2 相同,但 $connection 不同。

现在,在您的控制器方法中或执行代码的任何地方,您都可以使用 eloquent 对查询进行分块:

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

我认为这可以完成工作,你可以测试一下吗?

【讨论】:

  • 感谢您的回答。一旦我可以测试这个,我会发布一些反馈。
  • 如果其中一个数据库的表结构不同怎么办?
  • 我认为这无关紧要。如果是不同的表名,只需设置table 字符串。如果有不存在的列,eloquent 会忽略它们。
  • 这不仅仅是不同的表名。第一个也是最重的表包含我对内容本身更感兴趣的外键。所以不要说 "user_id" = 23;例如,我宁愿有“用户”=马克吐温。我是通过一个相当复杂的 SQL 语句来实现的。
  • 您必须使用 eloquent 逐列执行该操作。喜欢:$m2->user = UserOnOtherDB::find( $m1->user_id ->name)。相同的属性会自动填充,你需要的就填。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2020-08-30
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多