如何让SQLite在Laravel中运行

Ale*_*mia 17 sqlite laravel-5 laravel-5.1 laravel-5.2

每当我运行时php artisan migrate,控制台中都会显示以下错误:

[PDOException]
SQLSTATE [HY000] [14]无法打开数据库文件

database.sqlite文件位于数据库/.我正在运行Windows 10,Laravel 5.2.这是.env文件配置:

.ENV:

DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=homestead
DB_PASSWORD=secret
Run Code Online (Sandbox Code Playgroud)

我到处寻找,但找不到导致此错误的原因以及解决方法.

更新

我设法使迁移更换成功运行DB_DATABASE=databaseDB_DATABASE=database/database.sqlite.ENV文件.但是,每当我尝试从数据库中检索项时,都会发生新错误:

public function index()
{
    // cause of the error
    $cards = Card::all();

    return view('cards.index', compact('cards'));
}
Run Code Online (Sandbox Code Playgroud)

以上操作会引发以下错误:

SQLiteConnector.php第34行中的InvalidArgumentException:
数据库(database/database.sqlite)不存在.

奇怪的是,该命令Card::all()php artisan tinker模式下完美无缺.这有什么神奇之处?

无论如何,我也发现了那条线:

'database' => env('DB_DATABASE', database_path('database.sqlite')),
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

如您所见,它们的输出不同,第二个是预期的.这是一个Laravel漏洞吗?还是我误解了什么?

Ale*_*mia 17

简短解决方案

虽然没有回答这个问题,但修复"未找到数据库"问题的方法是替换database.php中的以下行:

'database' => env('DB_DATABASE', database_path('database.sqlite')),
Run Code Online (Sandbox Code Playgroud)

'database' => database_path('database.sqlite'),
Run Code Online (Sandbox Code Playgroud)

  • 为我节省了很多时间。使用 Laravel 5.2 和 Windows 7 64 位。谢谢! (3认同)

mot*_*tia 15

.env文件应包含以下内容:

DB_DATABASE = .. \数据库\ database.sqlite

通过一些测试,您可以验证DB_DATABASE中包含的链接是否与"公共"目录相关(至少在我的Windows机器上).这就是为什么我们应该在你的链接之前介绍.. \.

当然,使用绝对链接也应该这样做

DB_DATABASE = d:\ WWW \项目\数据库\ database.sqlite

正如@Josh建议的那样

.env文件应包含以下内容:

   DB_DATABASE=database\database.sqlite
Run Code Online (Sandbox Code Playgroud)

通过一些测试,您可以验证DB_DATABASE中包含的链接是否与"公共"目录相关(至少在我的Windows机器上).这就是为什么我们应该在你的链接之前介绍.. \.

当然,使用绝对链接也应该这样做

  'database' => env('DB_DATABASE/..', database_path('database.sqlite')),
Run Code Online (Sandbox Code Playgroud)

正如@Josh建议的那样

更新

通过使用相对路径,迁移将失败,因为它们使用项目目录作为根目录...

为了纠正一切,我建议设置:

   DB_DATABASE=..\database\database.sqlite
Run Code Online (Sandbox Code Playgroud)

并调整config/database.php中的sqlite连接,如下所示:

   DB_DATABASE=D:\www\project\database\database.sqlite 
Run Code Online (Sandbox Code Playgroud)


ker*_*sef 7

  1. 创建database.sqlite在此文件夹中调用的文件作为database/database.sqlite

  2. 打开.env文件并将 MySQL 更改为 SQLite

  3. 使用“#”注释密码和用户名和数据库名称

  4. 运行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
Run Code Online (Sandbox Code Playgroud)

  • 注意:“database.sqlite”文件可以为空。只需运行“touchdatabase/database.sqlite”即可。 (4认同)

小智 6

我们的朋友@ alexander-lomia补充了芒果

更改:

'database' => env('DB_DATABASE', database_path('database.sqlite'))
Run Code Online (Sandbox Code Playgroud)

至:

'database' => database_path(env('DB_DATABASE'))
Run Code Online (Sandbox Code Playgroud)

database.php中

:)