代码之家  ›  专栏  ›  技术社区  ›  realtebo

Laravel:如何将数据从一个连接复制到另一个连接?

  •  1
  • realtebo  · 技术社区  · 3 年前

    我有一个 mysql 连接和a 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() 将连接重置为默认连接吗?

    主要目标/问题

    如何正确地动态更改模型的连接?

    0 回复  |  直到 3 年前
        1
  •  0
  •   realtebo    3 年前

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

    这样做的必要条件是默认连接是 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
    • 这只能做一次
    • 在插入之前截断目标(以便在开发中可重复)

    如果你能提出更有效的建议,请写一个答案