【问题标题】:How to make SQLite work in Laravel如何让 SQLite 在 Laravel 中工作
【发布时间】:2022-03-15 04:21:59
【问题描述】:

每当我运行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 错误吗?还是我误会了什么?

【问题讨论】:

  • @downvoter 请解释下票!我不明白我做错了什么
  • 我不知道谁投了反对票但有效的问题,你得到了我的投票。
  • 用以下内容替换 config/database.php 中的 'database' 行以使用相对路径:'database' => database_path(env('DB_DATABASE', 'database.sqlite')),

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


【解决方案1】:

短解

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

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

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

【讨论】:

  • 为我节省了很多时间。使用 Laravel 5.2 和 Windows 7 64 位。谢谢!
  • 它的工作原理......我很想知道它是如何工作的!可以吗?
【解决方案2】:

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

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

   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 中包含的链接 相对于“公共”目录(至少在我的 Windows 机器上)。这就是为什么我们应该在您的链接之前介绍..\

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

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

正如@Josh 建议的那样

【讨论】:

  • DB_DATABASE=..\database\database.sqlite 在 Laravel 8 上为我工作
【解决方案3】:
  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

【讨论】:

  • 注意:database.sqlite 文件可以为空。只需运行touch database/database.sqlite
  • @NicoHood 正好?
【解决方案4】:

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

变化:

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

收件人:

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

database.php

:)

【讨论】:

    【解决方案5】:

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

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

    或者在你的情况下:

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        这在 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

        【讨论】:

          【解决方案8】:

          最短和最简单的解决方案是删除 .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,laravel 5.3 仍会执行这些字符串并因此触发 mysql 错误。 database.php 文件已经有可用于定义/更新数据库的变量。
          【解决方案9】:

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

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

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

          【讨论】:

            【解决方案10】:

            这是我使用的设置,

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

            我还必须在数据库文件夹中运行touch database.sqlite

            【讨论】:

              【解决方案11】:

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

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

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

              当然,您将不得不拒绝 HTTP 请求对数据库文件夹的访问,但这应该很容易做到。

              【讨论】:

                猜你喜欢
                • 2012-08-19
                • 2019-11-09
                • 2015-10-16
                • 1970-01-01
                • 1970-01-01
                • 2016-04-11
                • 2021-05-29
                • 2019-02-12
                • 1970-01-01
                相关资源
                最近更新 更多