我正在努力将一个非常古老的项目迁移到laravel,我想到了用旧内容将数据库播种到新数据库。
以下是我为其中一个表格执行此操作的示例:
<?php
class CallsTableSeeder extends Seeder {
public function run()
{
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$link = mysql_connect($hostname, $username, $password);
mysql_select_db('olddatabase');
$callselect = 'SELECT * FROM calls';
$ressource = mysql_query($callselect);
$calls = array();
while($item = mysql_fetch_object($ressource))
{
$calls['id']=$item->id;
$calls['author_name']=$item->author_name;
$calls['comments']=$item->comment;
DB::table('calls')->insert($calls);
}
}
}
在我的DatabaseSeeder.php中,我有:
<?php
class DatabaseSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Eloquent::unguard();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
$this->call('MembersTableSeeder');
$this->command->info('The Members table has been seeded!');
$this->call('ContactsTableSeeder');
$this->command->info('The Contacts table has been seeded!');
$this->call('CallsTableSeeder');
$this->command->info('The Calls table has been seeded!');
$this->call('ClientsTableSeeder');
//and so on
}
}
问题是,当我做php artisan migrate时:refresh --seed我完成了迁移,第一个表的种子消息(它只有8行),但没有别的。该命令似乎在一段时间后停止,第二个表(Calls)将只从我的旧表中获取一些值。它似乎有一个运行时间阻止它为所有行做循环,但我看不到任何消息,它只是平原停止,当我检查数据库时,除了插入的行数之外,一切似乎都是正确的(I&#39;我失踪了几千,这是一个庞大的数据库)。
也许这不应该是这样做的方式,但到目前为止看起来它似乎对这项工作有效,除了这个问题。如何在更长的时间内运行命令?
答案 0 :(得分:1)
要查找发生了什么,为什么不抛出错误? 尝试把你的代码放在事务中,所有这些魔法都会发生在你身上......
DB::transaction(function(){
//transaction_code_here
});
顺便说一下,迁移完成后,您可以运行所需的特定种子:
php artisan db:seed --class=CallsTableSeeder
你可以截断Calls表,这样就可以清除它并重置autoincrement!
表示将代码更改为:
<?php
class CallsTableSeeder extends Seeder {
public function run()
{
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$link = mysql_connect($hostname, $username, $password);
mysql_select_db('olddatabase');
$callselect = 'SELECT * FROM calls';
$ressource = mysql_query($callselect);
$calls = array();
DB::table('calls')->truncate(); //ADDED BY ME
DB::transaction(function(){ //ADDED BY ME
while($item = mysql_fetch_object($ressource))
{
$calls['id']=$item->id;
$calls['author_name']=$item->author_name;
$calls['comments']=$item->comment;
DB::table('calls')->insert($calls);
}
}); //ADDED BY ME
}
}
然后你可以运行我上面写的artisan命令,这将:
1- truncate(&#34; reset&#34;)你&#34;来电&#34;表
2-运行您的插入DB :: table(&#39;调用&#39;) - &gt; insert($ calls); 在事务内部,这样一来,如果发生错误,它不仅不会提交更改,而且会因发生错误而抛出异常!
希望这有帮助!
干杯!
答案 1 :(得分:0)
你可能已经有一些超时...你可以尝试为你的PHP超时set_time_limit(3600);
(1小时)添加更多时间,但是如果它不够,那就更难了(可能添加一个字段)到您的数据库“is_migrated”,并使用队列系统)
出于好奇,像
这样的简单解决方案insert into db2.table1 (field1, field2, field3)
select field1, field2, field3 from db1.table1
不起作用?应该真的更快......