为什么Laravel 5 Artisan迁移未创建SQLite数据库?

4

我正在尝试使用artisan migratesqlite中创建表。

我在database.php中有以下内容:

    'sqlite' => [
        'driver' => 'sqlite',
        'database' => database_path('database.sqlite'),
        'prefix' => '',
    ],

这是我的迁移类up函数。

    Schema::connection('sqlite')->create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

注意:我已通过环境变量将DB_CONNECTION设置为sqlite。
在命令行中,我得到了“nothing to migrate”的提示,并且没有创建任何db(也没有表)。
有什么办法可以让“artisan migrate”在“laravel 5”中创建一个sqlite数据库吗?
我没有问题使用artisan创建mysql表。
谢谢

artisan migrate:status显示了什么? - linuxartisan
+------+--------------------------------------+ | 运行?| 数据库迁移 | +------+--------------------------------------+ | 是 | 2014_10_12_000000_create_users_table | | 是 | 2016_07_01_101905_create_test_table | +------+--------------------------------------+ - lucsan
4个回答

7

这是因为您没有创建数据库。使用以下命令touch来创建新的SQLite数据库。

touch database/database.sqlite

然后按照以下方式配置环境变量

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

我应该提到我已经尝试过那个方法,但它没有起作用,而且除了sqlite创建一个数据库文件之外,那里没有其他文件。 - lucsan

4
为了回答OP问题的这一部分: “有什么办法可以让artisan migrate在laravel 5中创建一个sqlite db?”
在某些情况下,需要脚本化部署和迁移,我使用服务提供者来检查Sqlite DB是否存在,如果不存在则创建。
以下是步骤:
1)创建一个提供者并将其保存到app/Providers/SqliteServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class SqliteServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        $databaseFile = config('database.connections.sqlite.database');
        if (!file_exists($databaseFile)) {
            info('Make Sqlite File "' . $databaseFile . '"');
            file_put_contents($databaseFile, '');
        }
    }
}

2) 在 config/app.php 中注册提供程序。例如,在 L5.8 的新安装中,SqliteServiceProvider 将放置在 RouteServiceProvider 下面,如下所示:

'providers' => [

    //...

    /*
     * Application Service Providers...
     */
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    // App\Providers\BroadcastServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,
    App\Providers\SqliteServiceProvider::class, // <--- HERE

],

3) 将以下内容添加/替换到config/database.php'connections'元素中:

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

4) 在我的.env文件中添加以下内容:

DB_SQLITE_FILEPATH=/full/path/to/mysqlitefilename.sqlite

...但如果您愿意,您可以跳过此步骤,数据库将被创建为database/database.sqlite

5) 像往常一样运行迁移,sqlite文件应该会被创建并填充。


0

没错,你需要创建一个空的database.sqlite文件。

如果你想让artisan加载具体的.env文件,你还应该使用artisan --env参数。例如,artisan --env=testing migrate将强制artisan加载.env.testing文件。


不错的自定义环境提示! - Mere Development

0

好的我懂了。看起来 artisan migrate 命令忽略了 env DB_CONNECTION 和 database.php 的默认值(它们都会读取 env)。相反它使用了 .env 文件中的 DB_CONNECTION,将其设置为 sqlite 可以工作(此外,如上所述,您确实需要手动创建数据库文件,这对于即时生成数据库有点麻烦。)

这还意味着你不能在运行时更改 artisan migrate 数据库类型(例如:sqlitemysql),因为你需要每次更改目标数据库类型时更改 .env 变量。

go laravel。


1
为什么每次都要更改.env变量?您只需要更改目标数据库,所有设置都将被拾取。您可以为数据库指定特定的变量名称。例如DB_SQLITE_DATABASE、DB_PGSQL_DATABASE、DB_PGSQ_USERNAME等。 - tnash

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