每当我运行
php artisan migrate
时,控制台中都会显示以下错误:
[PDO异常]
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
我到处寻找,但找不到导致此错误的原因以及如何解决它。
我通过在
.env文件中将
DB_DATABASE=database
替换为 DB_DATABASE=database/database.sqlite
成功运行迁移。但是,每当我尝试从数据库中检索项目时,就会出现新的错误:
public function index()
{
// cause of the error
$cards = Card::all();
return view('cards.index', compact('cards'));
}
上述操作引发以下错误:
SQLiteConnector.php 第 34 行中的 InvalidArgumentException:
数据库(database/database.sqlite)不存在。
奇怪的是,命令
Card::all()
在 php artisan tinker
模式下完美运行。这是什么魔法?
无论如何,我也发现了这一行:
'database' => env('DB_DATABASE', database_path('database.sqlite')),
在 database.php 文件中需要替换为
database_path('database.sqlite')
并且一切都开始正常工作。
看来,问题的根源是
env('DB_DATABASE')
调用。我转到 SQLiteConnector.php 文件并转储 env('DB_DATABASE')
和 database_path('database.sqlite')
的输出。以下是他们的输出分别:
dd(env('DB_DATABASE')) // => 'database/database.sqlite'
dd(database_path('database.sqlite')) // => 'D:\www\project\database\database.sqlite'
如您所见,它们的输出不同,第二个是预期的。这是 Laravel 的错误吗?还是我理解错了什么?
虽然没有回答问题,但修复“找不到数据库”问题的方法是替换database.php中的以下行:
'database' => env('DB_DATABASE', database_path('database.sqlite')),
与
'database' => database_path('database.sqlite'),
使用相对路径,迁移将会失败,因为它们使用项目目录作为根目录...
要纠正所有问题,我建议设置:
DB_DATABASE=database\database.sqlite
并调整 config/database.php 中的 sqlite 连接,如下所示:
'database' => env('DB_DATABASE/..', database_path('database.sqlite')),
.env 文件应包含以下内容:
DB_DATABASE=..\database\database.sqlite
通过一些测试,您可以验证该链接是否包含在 DB_DATABASE 中 是相对于“public”目录的(至少在我的 Windows 机器上)。这就是为什么我们应该在链接之前介绍
..\
。
当然,使用绝对链接也应该这样做:
DB_DATABASE=D:\www\project\database\database.sqlite
正如@Josh建议的那样
在此文件夹中创建名为
database.sqlite
的文件作为 database/database.sqlite
打开
.env
文件并将MySQL更改为SQLite
使用“#”注释密码和用户名以及数据库名称
奔跑
php artisan migrate
享受
env 文件如下:
DB_CONNECTION=sqlite
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=database
#DB_USERNAME=homestead
#DB_PASSWORD=secret
补充我们的朋友@alexander-lomia的遮阳篷
更改:
'database' => env('DB_DATABASE', database_path('database.sqlite'))
致:
'database' => database_path(env('DB_DATABASE'))
在 database.php
:)
您需要在
.env
文件中使用绝对路径,而不是相对路径。
DB_DATABASE=/var/www/project/database/database.sqlite
或者根据您的情况:
DB_DATABASE=D:\www\project\database\database.sqlite
我遇到了和你一样的问题。您必须使用 ENV 文件中的绝对路径。
请查看官方文档https://laravel.com/docs/5.4/database
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
这在 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
。
最短、最简单的解决方案是删除.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
如果您喜欢使用相对路径,我发现以下方法效果很好:
将 SQLite 下的“数据库”行替换为以下内容:
'database' => database_path(env('DB_DATABASE', 'database.sqlite')),
这是我使用的设置,
'sqlite' => [
'driver' => 'sqlite',
'database' => database_path('database.sqlite'),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
我还必须在数据库文件夹中运行
touch database.sqlite
。
问题是
php artisan migrate
将使用项目根目录中的 DB_DATABASE
,而使用 php artisan serve
服务项目将从公共目录运行。
对我来说最好的解决方案是在公共目录中创建数据库的链接:
ln -s database public/database
mklink /J public\database database
当然,那么您必须拒绝 HTTP 请求对数据库文件夹的访问,但这应该很容易完成。
这对我有用
创建数据库文件
touch database/database.sqlite
像这样在
.env
中指定数据库
DB_CONNECTION=sqlite
#DB_HOST=127.0.0.1
#DB_PORT=3306
DB_DATABASE=database.sqlite
#DB_USERNAME=root
#DB_PASSWORD=
config/database.php
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => database_path(env('DB_DATABASE')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
...
php artisan migrate
这四个步骤对我来说已经足够了。
我的设置:
Windows 11, "php": "^8.1", "laravel/framework": "^10.10"
,