首页 > 解决方案 > Laravel:如何将数据从一个连接复制到另一个?

问题描述

我有一个mysql连接和一个pgsql(postgres,设置为默认)连接。

我必须从 mysql 的表中读取所有行,然后将所有行保存到 postgres

我试过这样做,记住我的默认连接是pgsql

$mysql_model = new Regioni();
$regioni = $mysql_model->setConnection("mysql")->all();

但它仍在使用pgsql连接。

我确信这一点,因为我试图在 pgsql 表中插入一行(它是空的),我可以将这一行作为所有结果转储。

另外,我(仅用于调试,不要讨厌我),修改vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php,在此方法中添加调试回显

/**
 * Set the connection associated with the model.
 *
 * @param  string|null  $name
 * @return $this
 */
public function setConnection($name)
{
    echo "Model calling setConnection($name)" . PHP_EOL;
    $this->connection = $name;

    return $this;
}

结果我可以看到

Model calling setConnection(mysql)
Model calling setConnection()
Model calling setConnection(pgsql)

第一个是我的显式 setConnection 的结果。

但是为什么调用->all()会将连接重置为默认连接?

主要目标/问题

动态改变模型连接的正确方法是什么?

标签: phplaravellaravel-8

解决方案


我发布了我的实际解决方案。这很丑陋,但它有效。

这样做的必要条件是默认连接,pgsql所以我必须明确设置连接以读取所有表记录nysql

在那之后,我循环然后保存到pgsql简单地做一个插入时间

    $regioni =  (new Regioni)->setConnection('mysql')->get();
    (new Regioni)->truncate();
    foreach($regioni as $r) {
        (new Regioni)->insert($r->toArray());
    }

请注意,这是专门针对我的情况

  • 我有一个旧的 mysql 要迁移到新的 postgresql
  • 我已经在 postgresql 上进行了迁移,所以所有结构都准备好了
  • 我从源读取所有数据并简单地写入目标 postgres
  • 这必须只做一次
  • 我在插入之前截断目标(在开发中可重复)

如果您可以提出更有效的建议,请写一个答案


推荐阅读