如何让 SQLite 在 Laravel 中工作

问题描述 投票:0回答:12

每当我运行

php artisan migrate
时,控制台中都会显示以下错误:

[PDO异常]
SQLSTATE[HY000] [14] 无法打开数据库文件

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

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

更新

我通过在

.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 的错误吗?还是我理解错了什么?

sqlite laravel-5.1 laravel-5
12个回答
36
投票

简短的解决方案

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

'database' => env('DB_DATABASE', database_path('database.sqlite')),

'database' => database_path('database.sqlite'),

21
投票

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

要纠正所有问题,我建议设置:

   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建议的那样


21
投票
  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

12
投票

补充我们的朋友@alexander-lomia的遮阳篷

更改:

'database' => env('DB_DATABASE', database_path('database.sqlite'))

致:

'database' => database_path(env('DB_DATABASE'))

database.php

:)


4
投票

您需要在

.env
文件中使用绝对路径,而不是相对路径。

DB_DATABASE=/var/www/project/database/database.sqlite

或者根据您的情况:

DB_DATABASE=D:\www\project\database\database.sqlite

3
投票

我遇到了和你一样的问题。您必须使用 ENV 文件中的绝对路径。

请查看官方文档https://laravel.com/docs/5.4/database

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

3
投票

这在 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' => '',
        ],
    
        ...
    ]
    

我的文件位于

database/testing-db.sqlite


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

1
投票

如果您喜欢使用相对路径,我发现以下方法效果很好:

将 SQLite 下的“数据库”行替换为以下内容:

'database' => database_path(env('DB_DATABASE', 'database.sqlite')),

0
投票

这是我使用的设置,

'sqlite' => [
    'driver' => 'sqlite',
    'database' => database_path('database.sqlite'),
    'prefix' => '',
    'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],

我还必须在数据库文件夹中运行

touch database.sqlite


0
投票

问题是

php artisan migrate
将使用项目根目录中的
DB_DATABASE
,而使用
php artisan serve
服务项目将从公共目录运行。

对我来说最好的解决方案是在公共目录中创建数据库的链接:

  • UNIX:
    ln -s database public/database
  • Windows:
    mklink /J public\database database

当然,那么您必须拒绝 HTTP 请求对数据库文件夹的访问,但这应该很容易完成。


0
投票

这对我有用

  1. 创建数据库文件

    touch database/database.sqlite

  2. 像这样在

    .env
    中指定数据库

    DB_CONNECTION=sqlite
    #DB_HOST=127.0.0.1
    #DB_PORT=3306
    DB_DATABASE=database.sqlite
    #DB_USERNAME=root
    #DB_PASSWORD=
  1. 像这样修改
    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),
        ],
   ...
  1. 运行迁移
    php artisan migrate

这四个步骤对我来说已经足够了。

我的设置:

Windows 11, "php": "^8.1", "laravel/framework": "^10.10"

© www.soinside.com 2019 - 2024. All rights reserved.