我有一个完整的数据库,需要创建迁移。我想必须有一种方法从转储中做到但不确定。有没有办法自动或至少更容易完成这项任务?
答案 0 :(得分:41)
您可以像这样在Laravel中导入转储:
DB::unprepared(file_get_contents('full/path/to/dump.sql'));
如果我要重构现有的应用程序,我会花时间从头开始编写迁移,将转储导入不同的表(如果表名相同,则导入不同的数据库)然后导入通过种子满足新结构。
答案 1 :(得分:19)
Laravel不能这样做,但我认为这会有所帮助:Laravel migration generator
它基于现有表格生成迁移。
答案 2 :(得分:12)
这个问题已经得到解答,但最近在一个项目中,提供的答案不再满足我的需求。它也不会导入整个数据库转储,而是导入一个(大)表。我觉得我应该和你分享。
问题是,我想在我的工匠:迁移操作期间导入一个非常大的表(zipcodes列表)。使用DB :: unrepared($ 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);
只需根据需要更新查询。当然,你应该确保那个带有cols的表 ' col1',' col2'等...存在。我在导入文件之前创建了它。使用Schema :: create()...
如果您遇到以下错误消息:
PDO::exec(): LOAD DATA LOCAL INFILE forbidden
有一种方法可以摆脱这条消息:虽然它没有真正记录在案,但你可以添加一个'选项' config / database.php文件的关键。例如我的看起来像:
'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。
答案 3 :(得分:9)
我有一个完整的数据库,需要创建迁移。我想必须有一种方法从转储中做到但不确定。有没有办法自动或至少更容易完成这项任务?
不是自动的,但我们使用DB::unprepared()
在迁移中运行转储。您可以使用file_get_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()
{
}
}
答案 4 :(得分:4)
另一个解决方案在Laravel 5.2中为我工作:
DB::unprepared(File::get('full/path/to/dump.sql'));
答案 5 :(得分:4)
我正在写我的答案,因为这可能对使用新 Laravel 8 的人有所帮助。
在 laravel 8 中,可以使用 SQL(.dump) 文件转储 SQL 并运行迁移。详情请参考以下链接。
https://laravel.com/docs/8.x/migrations#squashing-migrations
php artisan schema:dump
// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune
schema:dump
将在数据库 > 架构下创建新目录,SQL 转储将存储在那里。
之后,当您首先尝试迁移时,它将从架构运行转储文件,然后是任何挂起的迁移。
答案 6 :(得分:2)
您可以使用https://github.com/XCMer/larry-four-generator
直接从数据库创建laravel迁移和模型安装软件包后执行以下代码
php artisan larry:fromdb
答案 7 :(得分:2)
这是链接: http://laravel.stonelab.ch/sql-seeder-converter/
如果您有任何改进建议或问题,可以在这里发表评论: http://www.stonelab.ch/en/sql-to-laravel-seeder-converter/
答案 8 :(得分:2)
另一种选择是直接使用PDO:
$sql_dump = File::get('/path/to/file.sql');
DB::connection()->getPdo()->exec($sql_dump);
答案 9 :(得分:1)
您可以使用Raahul / Larryfour Package,Laravel 4的模型和迁移生成器
安装完成后,您可以使用命令行从现有数据库创建迁移,如下所示:
php artisan raahul:fromdb --only yourdatabase
您将在app / migrations /文件夹中找到迁移
答案 10 :(得分:-1)
Laravel Article提供的简单解决方案,用于从现有数据库表生成迁移文件。
尝试:https://laravelarticle.com/laravel-migration-generator-online