3 minutes
如何在 Go 裡用 PostgreSQL 實作 CRUD
本篇文章要說的是,資料庫的增刪修,也就是 CRUD(Create、Read、Update、Delete),指的就是建立資料表時所使用的 insert、select、update、delete。
select 的部份還會解釋 scan 的用法,分別是 scan 一個簡單值、一個 struct、struct 切片。
資料庫
Makefile
在此我們先建立一個 Makefile,用以方便產生資料庫與建立資料表。資料表的內容則寫在 init.sql。
建立資料表
以下為腳本 init.sql,用來建立 products 資料表,並為欄位定義。
PostgreSQL
執行返回資料的 SQL 語句時,我們使用了 database/sql
包中提供的 Query
方法。每個都返回一個 row 或 rows,可以使用 Scan 方法將其數據複製到變數。
執行不返回數據的語句時,可使用 Exec
或 ExecContext
方法。常用於:Insert
、Delete
、Update
的 SQL 語句。
database/sql
包,提供兩種執行結果查詢的方法:
- 查詢單行 —
QueryRow
最多從數據庫中返回一行。 - 查詢多行 —
Query
將所有匹配的
新增 Insert
插入數據要注意,MySQL 佔位符用 ?,?,? ,PostgreSQL 用 $1,$2,$3。
SQL 語句為插入兩個欄位的值,並在最後加上 returning *
,返回所插入資料的所有欄位。
查詢 Read
首先定義一個 SQL 查詢字串 listProductsQuery
,用來從資料表中選取所有欄位,並依照 id 排序。
定義 ListProducts
方法,它屬於 ProductService
結構,並返回一個包含 Product 指標的切片和一個 error。
使用 ps.db (代表資料庫連線)執行 SQL 查詢,這裡使用 Query
查詢多行,查詢結果儲存在 rows 中,錯誤存在 err 中。
defer rows.Close()
使用 defer
確保當函式結束時,自動關閉 rows
釋放持有的任何資源。
宣告一個 result 的切片,用來儲存查詢結果中的每一筆產品資料,切片中存放的是 product
指標。
rows.Next()
是一個在 Query 裡的一個 Next 方法,可以迭代數據庫的指標,進而獲取每一行的數據,當它迭代到最後一行數據後,會觸發一個 io.EOF
的信號,引發一個錯誤,屆時 go 會自動調用 rows.Close()
方法釋放連接,然後返回 false,此 for 循環就會結束。
宣告一個變數 i ,用來暫存當前行的產品資料,資料型態為 Product
。
rows.Scan()
將當前行的欄位值,依次掃描到 i 欄位中。
將 i 的指標加入到 result
切片中,方便之後返回所有結果。
- 列表查詢
- ID 查詢
修改 Update
刪除 Delete
主程式
621 Words
2024-11-06 00:00