php - 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()
会将连接重置为默认连接?
主要目标/问题
动态改变模型连接的正确方法是什么?
解决方案
我发布了我的实际解决方案。这很丑陋,但它有效。
这样做的必要条件是默认连接,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
- 这必须只做一次
- 我在插入之前截断目标(在开发中可重复)
如果您可以提出更有效的建议,请写一个答案
推荐阅读
- precision - 数值计算中的边界误差
- python - 无法在 Cloud Shell 中将 Google App Engine 连接到 CloudSQL Postgres(通过 SQLAlchemy)
- javascript - 是否可以只更新对象的数组状态?
- functional-programming - 为什么我的列表反向函数可以自己工作,而不是在另一个函数内部?
- python-3.x - 我没有将 pyaudio 库安装到我的系统中
- c - 什么是分段核心转储?我该如何解决?
- python - 在重置变量时循环主函数
- python - 如何修复 fit() 方法中的“TypeError:'CategoricalDtype' 类型的对象没有 len()”问题?
- raspberry-pi3 - 当两个节点向其中输出 1 时,有没有办法让 gpio 输出 1?
- javascript - 有没有办法优化粒子生成算法以处理许多对象?