SQLite无法打开数据库文件:Laravel + Windows

5

我正在尝试在我的Laravel项目中使用SQLite数据库,用于开发的本地环境(Windows 8.1 with AMMPS),但是当我尝试运行migrate:instal命令时,出现了以下错误:

[PDOException] SQLSTATE[HY000] [14] unable to open database file

我的数据库配置文件(app/config/local/database.php):

<?php

return array(
    'default' => 'sqlite',

    'connections' => array(
        'sqlite' => array(
            'driver'   => 'sqlite',
            'database' => __DIR__ . '\..\..\database\production.sqlite',
            'prefix'   => '',
        ),
    ),
);

可能是数据库被锁定了? - ori
我没有穿任何地方,怎么办? - Miguel Borges
你的数据库路径中最后一个斜杠应该是反斜杠 \ 而不是正斜杠 /。 - BrokenBinary
是的,但问题不在于此。 - Miguel Borges
你尝试过使用sqlite ide吗?例如SQLite Expert Personal是免费软件。这样你就可以知道数据库是否可用。 - Ryan Vincent
你有production.sqlite这个文件吗?你的“web用户”有读取该文件的权限吗?另外,请查看这个问题:https://dev59.com/1YPba4cB1Zd3GeqPnhm9 - Luís Cruz
10个回答

19

尝试在您的 .env 文件中删除 DB_DATABASE="yourdatabase" 变量


1
由于.env文件的值是从config/database.php中加载的,只要键在其中列出,无论其值如何。如果在.env文件中找不到键,则默认为在config/database.php中设置的值,对于DB_DATABASE来说,在Laravel 5.3中它将是.../database/database.sqlite - SEsterbauer

4
如果权限允许在文件夹中写入,只需创建存储文件夹即可。
例如,这就是我解决问题的方法。
在`config/database.php`中:
'connections' => [

  'sqlite' => [
      'driver'   => 'sqlite',
      'database' => storage_path('database/databaseName.sqlite'),
      'prefix'   => '',
  ],

如果你在终端中运行php artisan migrate命令,会返回[PDOException] SQLSTATE[HY000] [14] unable to open database file错误。

请自己创建路径文件夹,例如在终端中运行mkdir storage/database/databaseName.sqlite

确保权限允许写入,然后重新运行php artisan migrate命令,它将返回成功消息:Migration table created successfully


2

在laravel 5.3.x版本中

这是我唯一有效的方法:

将DB_CONNECTION从"mysql"改为"sqlite"。因为这是一个sqlite数据库,您可以删除.env文件中的所有其他DB_*项。

APP_ENV=local APP_KEY=base64: APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost

DB_CONNECTION=sqlite


2
你只需要将sqlite文件放置在指定路径即可。在Laravel 5.7中,我使用以下命令并运行迁移。"最初的回答"
touch /absolute/path/of/db.sqlite

这将会在指定的位置创建一个空文件,然后你就可以开始使用了。
观察发现:在 Laravel 5.7 中,.sqlite 文件应该已经存在于指定位置。
对于 Windows 系统,请右键点击并在指定位置创建一个以指定名称命名的新文件。

1
尝试更改文件databaseName.sqlite的权限,使数据库可写和可读。也许还需要更改database文件夹的权限。
在生产服务器上,将此文件数据库更改为私有目录以提高安全性。

1

虽然可能有点晚,但我在ubuntu环境中也遇到了这个问题,以下是我如何解决的:

你需要将完整路径的sqlite文件路径传递给你的.env文件,像下面这样:

DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE="/var/www/html/my-awesome-project/database/database.sqlite"
DB_USERNAME=homestead
DB_PASSWORD=secret

在这里更改DB_DATABASE键的值为计算机文件系统中您的sqlite文件的确切位置。

提示: 您可以通过添加以下内容找到sqlite文件的数据库路径

dd(database_path('database.sqlite'));

config/database.php文件的顶部添加这行代码,并在终端中运行php artisan migrate。您可以从那里找到确切的位置,将其复制并放入.envDB_DATABASE键中。
在测试之前,请不要忘记重新启动Laravel服务器并从database.php中删除dd(database_path('database.sqlite'));

0
在我的情况下,将 url: '%env(DATABASE_AUTH_URL)%' 更改为 url: '%env(resolve:AUTH_DATABASE_URL)%' 解决了这个问题。

0
几乎,你必须设置正确的路径到你的SQLite数据库文件。
为了减轻.env文件和config文件夹中的database.php文件之间的冲突,只需在database.php文件中设置数据库文件路径,并从.env文件中删除它。 .env文件只写入连接信息并删除其他数据库属性。
DB_CONNECTION=sqlite 然后打开config/database.php,进入connections数组,并将数据库路径更改为你的数据库文件路径 database_path('your database file path')
'connections' => [

    'sqlite' => [
        'driver' => 'sqlite',
        'url' => env('DATABASE_URL'),
        'database' => database_path('mydb.sqlite'),
        'prefix' => '',
        'foreign_key_constraints' => env('DB_FOREIGN_KEYS', false),
    ],

-2
请检查存储数据库文件的目录权限。chmod 777 YOU_APP/database

-3

DB_CONNECTION从“mysql”更改为“sqlite”。 因为这是一个sqlite数据库,所以您可以删除该.env文件中的所有其他DB_*项。

APP_ENV=local
APP_KEY=base64:
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

DB_CONNECTION=sqlite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接