我可以将mysql转储导入laravel迁移吗?
我有一个完整的数据库,需要创建迁移。我想一定有办法在垃圾堆里做,但不确定。有什么方法可以自动或至少更容易地完成这项任务吗?Laravel无法做到这一点,但我认为这会有所帮助:我可以将mysql转储导入laravel迁移吗?,laravel,Laravel,我有一个完整的数据库,需要创建迁移。我想一定有办法在垃圾堆里做,但不确定。有什么方法可以自动或至少更容易地完成这项任务吗?Laravel无法做到这一点,但我认为这会有所帮助: 它基于现有表生成迁移。您可以使用Raahul/Larryfour包,这是一个用于Laravel 4的模型和迁移生成器 安装后,您可以使用命令行从现有数据库创建迁移,如下所示: php artisan raahul:fromdb --only yourdatabase DB::unprepared(file_get_co
它基于现有表生成迁移。您可以使用Raahul/Larryfour包,这是一个用于Laravel 4的模型和迁移生成器 安装后,您可以使用命令行从现有数据库创建迁移,如下所示:
php artisan raahul:fromdb --only yourdatabase
DB::unprepared(file_get_contents('full/path/to/dump.sql'));
您将在app/migrations/folder中找到迁移
我有一个完整的数据库,需要创建迁移。我想一定有办法在垃圾堆里做,但不确定。有没有什么方法可以自动或至少更容易地完成这项任务
不是自动的,但是我们使用DB::unprepared()
在迁移中运行转储。您可以使用file\u get\u contents
从.sql
文件导入,因此不必担心转义整个转储的“
标记
<?php
use Illuminate\Database\Migrations\Migration;
class ImportDump extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared("YOUR SQL DUMP HERE");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
}
您可以使用
安装包后执行以下代码
php artisan larry:fromdb
您可以在Laravel中导入转储,如下所示:
php artisan raahul:fromdb --only yourdatabase
DB::unprepared(file_get_contents('full/path/to/dump.sql'));
但是,如果我要重构一个现有的应用程序,我会花时间从头开始编写迁移,将转储导入不同的表(或不同的数据库,如果表名相同)然后通过seed将内容导入到新结构。这个问题已经得到了回答,但最近在一个项目中,提供的答案不再满足我的需要。它也不会导入整个数据库转储,而是导入一个(大)表。我觉得我应该与您共享
问题是,我想在artisan:migrate操作期间导入一个相当大的表(zipcodes列表)。使用DB::unprepared($dump)的解决方案耗时很长,我找到了一个速度更快的替代方案
只需将表导出为CSV,并在迁移的up()函数中使用以下代码
// i had to str_replace the backslash on windows dev system... but works on linux, too
$filename = str_replace("\\", "/", storage_path('path/in/storage/to/your/file.csv'));
$query = "LOAD DATA LOCAL INFILE '".$filename."' INTO TABLE yourtable
FIELDS TERMINATED BY '\t'
ENCLOSED BY ''
LINES TERMINATED BY '\n'
IGNORE 0 LINES
(col1,col2,...);";
DB::unprepared($query);
只需根据需要更新查询。当然,您应该确保
“col1”、“col2”等…存在。我在导入文件之前创建了它。使用Schema::create()
如果您遇到以下错误消息:
PDO::exec(): LOAD DATA LOCAL INFILE forbidden
有一种方法可以消除此消息:虽然没有真正的文档记录,但您可以向config/database.php文件中添加一个“options”键。例如,我的如下所示:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'options' => array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
)
注意:我目前正在使用laravel 5,但它也应该适用于laravel 4。我最近遇到了同样的问题。我不想专门为此安装软件包,所以我决定编写一个小工具来帮助我和其他人;)
以下是链接:
如果您有任何改进建议或问题,请在此处发表意见:
在Laravel 5.2中,另一个解决方案对我有效:
DB::unprepared(File::get('full/path/to/dump.sql');
另一种选择是直接使用PDO:
使用light\Support\Facades\DB;
使用照明\支持\立面\文件;
$sql_dump=File::get('/path/to/File.sql');
DB::connection()->getPdo()->exec($sql\u dump);
Laravel文章提供了一个简单的解决方案,用于从现有数据库表生成迁移文件
尝试:
我正在写我的答案,因为这可能会对使用新laravel 8的人有所帮助
在laravel 8中,可以转储SQL并使用SQL(.dump)文件运行迁移。有关详细信息,请参阅下面的链接
schema:dump
将在database>schema下创建新目录,并在其中存储SQL dump。
之后,当您尝试首先迁移时,它将从架构运行转储文件,然后运行任何挂起的迁移。此解决方案适用于具有多个字符集和排序规则的数据库MySQL数据库。当使用带有phpmyadmin的sql文件导出集时,我必须使用DB::unprepared()作为DB::statement()抛出sql语法错误。请参阅tbuteler的answer@shock_gone_wild整洁,我不知道存在。修改了答案。这可能是绝对最好的方法,尤其是当数据库变得庞大时。只要数据库服务器与Web服务器位于同一台机器上,这是一个很好的解决方案,因为加载数据本地填充
将否则将失败。@rahmanisback否,文件路径必须是数据库服务器上文件的路径,无论该数据库位于何处。因此,如果您将转储放在远程数据库的/tmp/dump.sql中,并使用该路径调用它,它将起作用。@EllertvanKoperen是的,完全正确,但迁移脚本是应用程序代码的一部分,不应使用假设任何代码文件都将转到数据库服务器。此外,作为一个术语,迁移应与应用程序代码捆绑在一起,而不是单独上载到数据库服务器,以防数据库服务器与web服务器不同。在编写代码时,不应以数据库和应用程序的托管位置为初始前提。@rahmanisback您所说的是正确的sume和not Escape。但是远程还原确实有效,在某些情况下是一个非常重要的省时工具。我检测到输出中缺少逗号,现在它已修复。这不再支持L5Update:支持L5Update:我最近刚刚使用了此模式->迁移转换器,效果非常好:如果文件大小太大怎么办为了适应内存?这是一个完全不同的问题。您可以增加PHP的ini文件中的内存限制,或者在播种机上以编程方式这样做:ini\u set('memory\u limit','-1')
是的,这是一个不同的问题,但是文件获取内容仍然会因“太大”而失败“文件,就像许多千兆字节。我会使用你的方法,但使用fopen和fgets。phpMyAdmin导出可以使用“插入到”有趣而优雅的方法进行分块,这种方法应该可以工作,但在我的例子中不是。如果你用垃圾桶