如何让SQLite在Laravel中工作

时间:2016-04-02 13:24:16

标签: sqlite laravel-5 laravel-5.1 laravel-5.2

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

  

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

database.sqlite 文件位于 database / 。我正在运行 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

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

更新

我设法通过将<{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漏洞吗?或者我误解了什么?

9 个答案:

答案 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)

  1. 在此文件夹中将名为database.sqlite的文件创建为database/database.sqlite

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

  3. 使用'#'注释密码,用户名和databaseName

  4. 享受

这样的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中对我有用

  1. 在.env文件中只有连接名称并删除所有其他DB_相关设置:DB_CONNECTION=sqlite_testing

  2. config/database.php文件中定义sqlite设置:

    'connections' => [
    
        'sqlite_testing' => [
            'driver' => 'sqlite',
            'database' => database_path('testing-db.sqlite'),
            'prefix' => '',
        ],
    
        ...
    ]
    
  3. 我的文件位于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