每当我运行php artisan migrate
时,控制台中都会显示以下错误:
[PDOException]
SQLSTATE [HY000] [14]无法打开数据库文件
database.sqlite 文件位于 database / 。我正在运行 Windows 10 , Laravel 5.2 。这是 .env 文件配置:
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=homestead
DB_PASSWORD=secret
我到处寻找,但找不到导致此错误的原因以及解决方法。
我设法通过将<{1}}替换为 .env 文件中的DB_DATABASE=database
来成功运行迁移。但是,每当我尝试从数据库中检索项目时都会出现新错误:
DB_DATABASE=database/database.sqlite
以上操作会引发以下错误:
SQLiteConnector.php第34行中的InvalidArgumentException:
数据库(database / database.sqlite)不存在。
奇怪的是,命令public function index()
{
// cause of the error
$cards = Card::all();
return view('cards.index', compact('cards'));
}
在Card::all()
模式下完美运行。这有什么神奇之处?
无论如何,我也发现了这条线:
php artisan tinker
database.php 文件中的需要仅用'database' => env('DB_DATABASE', database_path('database.sqlite')),
替换,一切都能正常开始。
似乎问题的根源是database_path('database.sqlite')
。我转到 SQLiteConnector.php 文件并转储了env('DB_DATABASE')
和env('DB_DATABASE')
的输出。以下是他们的输出:
database_path('database.sqlite')
如您所见,他们的输出不同,第二个是预期的。这是一个Laravel漏洞吗?或者我误解了什么?
答案 0 :(得分:14)
虽然没有回答这个问题,但修复&#34;未找到数据库&#34; 问题的方法是替换 database.php 中的以下行:< / p>
'database' => env('DB_DATABASE', database_path('database.sqlite')),
带
'database' => database_path('database.sqlite'),
答案 1 :(得分:14)
.env文件应该包含:
DB_DATABASE = .. \数据库\ database.sqlite
通过一些测试,您可以验证DB_DATABASE中包含的链接 相对于公众&#39;目录(至少在我的Windows机器上)。这就是为什么我们应该在你的链接之前介绍.. \。
当然,使用绝对链接也应该这样做
DB_DATABASE = D:\ www \ project \ database \ database.sqlite
正如@Josh建议的那样
.env文件应该包含:
DB_DATABASE=..\database\database.sqlite
通过一些测试,您可以验证DB_DATABASE中包含的链接 相对于公众&#39;目录(至少在我的Windows机器上)。这就是为什么我们应该在你的链接之前介绍.. \。
当然,使用绝对链接也应该这样做
DB_DATABASE=D:\www\project\database\database.sqlite
正如@Josh建议的那样
通过使用相对路径,迁移将失败,因为它们将项目目录用作根目录...
为了纠正一切,我建议设置:
DB_DATABASE=database\database.sqlite
并调整config / database.php中的sqlite连接,如下所示:
'database' => env('DB_DATABASE/..', database_path('database.sqlite')),
答案 2 :(得分:6)
我们的朋友@ alexander-lomia
补充了芒果变化:
'database' => env('DB_DATABASE', database_path('database.sqlite'))
到:
'database' => database_path(env('DB_DATABASE'))
database.php 中的
:)
答案 3 :(得分:2)
您需要在.env
文件中使用绝对路径,而不是相对路径。
DB_DATABASE=/var/www/project/database/database.sqlite
或在你的情况下:
DB_DATABASE=D:\www\project\database\database.sqlite
答案 4 :(得分:2)
在此文件夹中将名为database.sqlite
的文件创建为database/database.sqlite
打开.env
文件并将MySQL更改为SQLite
使用'#'注释密码,用户名和databaseName
享受
这样的env文件:
DB_CONNECTION=sqlite
\#DB_HOST=127.0.0.1
\#DB_PORT=3306
\#DB_DATABASE=database
\#DB_USERNAME=homestead
\#DB_PASSWORD=secret
答案 5 :(得分:1)
最简单和最简单的解决方案是删除.env中的默认mysql设置并在database.php中工作。这至少对我有用。
删除以下内容......
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
答案 6 :(得分:1)
这在Laravel 5.5中对我有用
在.env文件中只有连接名称并删除所有其他DB_
相关设置:DB_CONNECTION=sqlite_testing
在config/database.php
文件中定义sqlite设置:
'connections' => [
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => database_path('testing-db.sqlite'),
'prefix' => '',
],
...
]
我的文件位于database/testing-db.sqlite
。
答案 7 :(得分:0)
我遇到了和你一样的问题。您必须使用ENV文件中的绝对路径。
请查看有关此https://laravel.com/docs/5.4/database
的官方文档DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
答案 8 :(得分:0)
这是我用过的设置,
'sqlite' => [
'driver' => 'sqlite',
'database' => database_path('database.sqlite'),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
我还必须在数据库文件夹中运行 touch database.sqlite
。