Laravel 使用 PostgreSQL 資料庫需要注意的點

laravel_peng發表於2022-05-11

首先安裝 PostgreSQL

1.你本地是什麼開發環境?

  • 如果你的開發環境是 Homestead,那麼恭喜你,不需要安裝,直接使用。
    • 資料庫賬號:homestead
    • 資料庫密碼:secert
  • 如果你的開發環境是整合的,或者自己搭建的環境,需要另行下載 PostgreSQL。安裝過程很簡單,按提示一步步走,不會的可參考菜鳥教程中 PostgreSQL 安裝 WindowsMac。最後需要設定並記住你資料庫的密碼。預設賬號是:postgres 密碼是:*你設定的密碼*
    • 官網地址:Download
    • EnterpriseDB 地址:Download (EnterpriseDB 是全球唯一一家提供基於 PostgreSQL 企業級產品與服務的廠商。)

2. 其次要看 PHP 支援的 pdo_pgsql 支援的 libpq 版本。

scram-sha-256是PostgreSQL 10中新增的基於SASL的認證方式,是PostgreSQL目前提供的最安全的認證方式。使用scram-sha-256認證方式不支援舊版本的客戶端庫。如果使用PostgreSQL 10以前的客戶端庫連線資料庫,會有如下錯誤:
SCRAM authentication requires libpq version 10 or above

  • 根據上面提示,注意你選擇下載安裝的 PostgreSQL 版本,它與你的 PHP 對應的 pdo_pgsql 擴充套件的 libpq 版本有關,他是連結資料庫的客戶端擴充套件。如果你的下載的 PostgreSQL 版本高,但是 PHP 擴充套件的 libpq 版本低,就會出現這個錯誤:SCRAM authentication requires libpq version 10 or above

  • 現在開啟你 PHP 的 pdo_pgsqlpgsql 擴充套件,如果沒有此擴充套件,去下載編譯,具體過程我不再贅述。然後透過輸出 phpinfo()函式,然後檢視 PHP 對應的 libpq 的版本,PostgreSQL 版本大於10 的話,需要 PHP 擴充套件 libpq 的版本至少大於 10:
    Laravel 使用 PostgreSQL 資料庫遇到的一些坑!

使用 Navicat 資料連線工具測試連線

  1. 虛擬主機中的 Homestead 開發環境連線 PostgreSQL:
    Laravel 使用 PostgreSQL 資料庫遇到的一些坑!

  2. 本地整合開發環境連線 PostgreSQL:
    Laravel 使用 PostgreSQL 資料庫遇到的一些坑!

配置 Laravel 的 .env 檔案需要注意的:

  1. homestead 的 Laravel 框架的配置:
    DB_CONNECTION=pgsql 
    DB_HOST=127.0.0.1 
    DB_PORT=5432    //  因為程式碼是在虛擬主機中,無需使用對映到主機上的埠,5432 即可。
    DB_DATABASE=psbc 
    DB_USERNAME=homestead 
    DB_PASSWORD=secert 
  2. 本地開發環境的 Laravel 框架的配置::
    DB_CONNECTION=pgsql
    DB_HOST=127.0.0.1
    DB_PORT=5432
    DB_DATABASE=psbc
    DB_USERNAME=postgres
    DB_PASSWORD=root

遷移檔案需要注意的點:

1. boolean 型別的使用。

型別 boolean tinyint(1) MySQL 官方文件指出目前不支援 boolean 型別,需要使用的話用 tinyint(1) 代替。如果你定義了布林型別,它會自動給你轉換成 tinyint。 BOOL,BOOLEAN是 tinyint(1) 的同義詞。

  • 遷移檔案內容如下:

    public function up()
    {
      Schema::table('ttx_staff', function (Blueprint $table) {
          // 新增一個員工的狀態欄位
          $table->boolean('status')->default(1)>after('article_num')->comment('使用者狀態');
      });
    }
  • 像上面的的遷移檔案中 boolean 方法,在執行遷移命令後:

    • PostgreSQL 資料庫表中生成的是 boolean 型別的 status 欄位。
      Laravel 使用 PostgreSQL 資料庫遇到的一些坑!
    • mysql 資料庫表中生成的是 tinyint 型別的 status 欄位。
      Laravel 使用 PostgreSQL 資料庫遇到的一些坑!
  • 也就是說 PostgreSQL 支援標準的 boolean 型別,MySQL 是不直接支援的,它是變相的支援。有關更多 PostgreSQL 支援的型別,請檢視 PostgreSQL 資料型別
    Laravel 使用 PostgreSQL 資料庫遇到的一些坑!
    Laravel 使用 PostgreSQL 資料庫遇到的一些坑!

  • 在這裡還有一個需要注意,after() 方法在 PostgreSQL 資料庫表中是不能用的,因為 PostgreSQL 資料庫本身不支援表欄位移動位置。但是 MySQL 是可以的。

2. char 型別的使用。

  • 遷移檔案內容如下:

    Schema::create('ttx_config', function(Blueprint $table)
    {    
          // 看這個 key 欄位的型別,它在 MySQL 和 PostgreSQL 中是有區別的
          // char 不給長度,Laravel 預設給字串長度為 255
          $table->char('key')->comment('配置名');
          $table->text('val', 65535)->nullable()->comment('配置值');
    });
  • 如果是 MySQL 生成的表欄位,它的欄位型別是 char
    Laravel 使用 PostgreSQL 資料庫遇到的一些坑!

  • 如果你的 PostgreSQL 生成的表欄位,它的型別也是 char
    Laravel 使用 PostgreSQL 資料庫遇到的一些坑!

  • 說道這裡是不是感覺沒什麼差別,請繼續往下看你就明白了。

    • 我在 tinker 中執行一個資料庫查詢
    • 使用 PostgreSQL:
      Laravel 使用 PostgreSQL 資料庫遇到的一些坑!
    • 使用 MySQL:
      Laravel 使用 PostgreSQL 資料庫遇到的一些坑!
  • 以上兩點是我已知的Laravel 配合 PostgreSQL 或配合 MySQL 在遷移檔案中使用出現不同的點。雖然不多,但都坑了我不少時間。如果你們發現有更多不同點,可以在文章下方留言討論。

資料查詢需要注意的點:

1. LIMIT 的使用:

  • PostgreSQL 不能使用 LIMIT 初始位置,記錄數 這種方式查詢。

    • 正確的:
      DB::SELECT("SELECT * FROM ttx_config LIMIT 1 OFFSET 2")
    • 錯誤的:
      DB::SELECT("SELECT * FROM ttx_config LIMIT 2, 1")
      Laravel 使用 PostgreSQL 資料庫遇到的一些坑!
  • 以上兩種方式的 LIMIT 查詢,MySQL 都支援。

2. `` 符號的使用:

  • PostgreSQL 不能使用 `` 這種符號。

    • 正確的:
      DB::SELECT("SELECT * FROM ttx_config LIMIT 1 OFFSET 2")
    • 錯誤的:
      DB::SELECT("SELECT * FROM `ttx_config` LIMIT 2, 1")
      Laravel 使用 PostgreSQL 資料庫遇到的一些坑!
  • 以上兩種方式的查詢,MySQL 都支援。

3. IFNULL 函式的使用:

  • PostgreSQL 沒有 IFNULL 這個函式。取而代之的是 COALESCE(欄位,預設值) 這個函式。

  • MySQL 支援 IFNULL 函式。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Xiao Peng

相關文章