You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 11 PostgreSQL迁移成功但表不存在问题求助

Laravel 11 PostgreSQL迁移成功但数据库无表问题排查

问题背景

我创建了Laravel 11新项目,选用PostgreSQL作为数据库。最初因email字段唯一约束报错,注释该字段后执行命令:

php artisan migrate:fresh

   INFO  Preparing database.  

  Creating migration table .......................................................................... 517.52ms DONE

   INFO  Running migrations.  

  0001_01_01_000000_create_users_table .............................................................. 777.08ms DONE

迁移显示成功,但数据库中找不到对应的users表。切换到MySQL或SQLite时迁移正常,表能正常生成。

相关配置与代码

迁移文件(0001_01_01_000000_create_users_table.php)

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            // $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

        // Schema::create('password_reset_tokens', function (Blueprint $table) {
        //     // $table->string('email')->primary();
        //     $table->string('token');
        //     $table->timestamps();
        //     // $table->timestamp('created_at')->nullable();
        // });

        // Schema::create('sessions', function (Blueprint $table) {
        //     $table->string('id')->primary();
        //     $table->foreignId('user_id')->nullable()->index();
        //     $table->string('ip_address', 45)->nullable();
        //     $table->text('user_agent')->nullable();
        //     $table->longText('payload');
        //     $table->integer('last_activity')->index();
        // });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
        // Schema::dropIfExists('password_reset_tokens');
        // Schema::dropIfExists('sessions');
    }
};

database.php配置片段

'default' => env('DB_CONNECTION', 'pgsql'),

'pgsql' => [
    'driver' => 'pgsql',
    'url' => env('DB_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '5432'),
    'database' => env('DB_DATABASE', 'laravel'),
    'username' => env('DB_USERNAME', 'root'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => env('DB_CHARSET', 'utf8'),
    'prefix' => '',
    'prefix_indexes' => true,
    'search_path' => 'public',
    'sslmode' => 'prefer',
],

.env配置片段

DB_CONNECTION=pgsql
DB_HOST=xxxxxxxxxxxx
DB_PORT=5432
DB_DATABASE=neondb
DB_USERNAME=neondb_owner
DB_PASSWORD=xxxxxxxxxxxx
DB_SSLMODE=require

可能的原因及解决办法

1. Neon数据库分支不匹配

你用的是Neon PostgreSQL,它有分支特性,很可能你执行迁移的分支和你查看的分支不是同一个。比如迁移操作在主分支,但你控制台查看的是某个开发分支。

解决:

  • 登录Neon控制台,核对.env里配置的数据库对应的分支,检查该分支下的表是否存在。
  • 执行迁移后,用Laravel的tinker验证表是否真实存在:
php artisan tinker
>>> DB::table('users')->get();

如果返回空集合,说明表存在只是你找错了地方;如果报错表不存在,再继续排查。

2. PostgreSQL搜索路径(search_path)问题

PostgreSQL的search_path决定了数据库对象的查找顺序。虽然你在database.php里配置了search_path' => 'public',但.env里设置了DB_SSLMODE=require,而database.php中pgsql配置的sslmode是prefer,可能存在配置覆盖,导致实际连接的search_path不是public。

解决:

  • 用PostgreSQL客户端连接后执行SHOW search_path;,查看当前路径是否包含public。
  • 如果路径不对,要么在database.php的pgsql配置里强制指定search_path为public,要么在迁移时直接指定表的schema:
Schema::create('public.users', function (Blueprint $table) {
    // 表结构定义不变
});

3. 隐性事务回滚

Laravel迁移默认在事务中执行,PostgreSQL的事务处理更严格,可能存在表面显示成功但实际因隐性错误回滚的情况。

解决:

  • 查看Laravel日志文件(storage/logs/laravel.log),搜索迁移相关的错误信息,有没有被忽略的异常。
  • 关闭迁移事务:在迁移类中添加public $transactional = false;,然后重新执行php artisan migrate:fresh。

4. 字符集配置冲突

PostgreSQL默认字符集是utf8mb4,你配置的charset' => env('DB_CHARSET', 'utf8')可能存在隐性冲突。

解决:

  • 修改database.php中pgsql的charset为utf8mb4:
'charset' => env('DB_CHARSET', 'utf8mb4'),

然后重新执行迁移命令。

内容的提问来源于stack exchange,提问作者Vera Lindberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:42:04