Laravel项目安装器执行migrate报错:数据库访问权限被拒绝
问题
我为Laravel项目编写了install.php文件,用于执行数据库迁移(migrate)和数据填充(db:seed),代码如下:
require __DIR__ . '/../vendor/autoload.php'; $app = require_once __DIR__ . '/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); file_put_contents('.env', $envContent); ob_start(); $kernel->call('migrate', ['--force' => true]); $kernel->call('db:seed');
该文件可正常保存.env文件并执行Artisan命令,但执行migrate时出现以下错误:
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = spnv_store and table_name = migrations and table_type = 'BASE TABLE')
我的数据库用户名并非root,主机也不是localhost,怀疑调用migrate时未读取.env中的数据库配置,恳请协助解决。
解决方案
问题核心是Laravel在初始化$app实例时已经加载了环境配置,而你是在这之后才写入的.env文件,导致迁移命令使用的还是旧的数据库配置。以下是两种可行的解决办法:
方法一:调整顺序,先写入.env再初始化应用
把写入.env的代码移到最前面,确保应用初始化时读取的是新的配置:
// 先写入.env文件 file_put_contents('.env', $envContent); // 再加载依赖并初始化应用 require __DIR__ . '/../vendor/autoload.php'; $app = require_once __DIR__ . '/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); ob_start(); $kernel->call('migrate', ['--force' => true]); $kernel->call('db:seed');
方法二:写入.env后手动重新加载配置
如果无法调整代码顺序,可以在写入.env后强制重新加载环境变量和配置:
require __DIR__ . '/../vendor/autoload.php'; $app = require_once __DIR__ . '/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); // 写入.env文件 file_put_contents('.env', $envContent); // 重新加载环境变量和配置 $app->useEnvironmentPath(__DIR__ . '/../'); $app->bootstrapWith([ \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class, \Illuminate\Foundation\Bootstrap\LoadConfiguration::class, ]); // 若存在配置缓存,先清除 $kernel->call('config:clear'); ob_start(); $kernel->call('migrate', ['--force' => true]); $kernel->call('db:seed');
内容的提问来源于stack exchange,提问作者skdev
相关产品推荐
相关产品推荐

