golang postgreDB CURD
golang에서 postgre데이터 베이스의 SQL 생성, 수정, 읽기, 삭제 기능의 간단한 사용법이다.
postgreDB가 이미 설치되어 있다는 전제하에 진행한다.
- 로컬 설정 : PostgreDB 설치
- 도커 이미지 : PostgreDB, pgadmin4 도커 설치 방법
1. 라이브러리 설치
go version : 1.17
> go get github.com/lib/pq
2. 테이블 구조
postgreDB에 아래와 같은 구조의 User 테이블이 선언된 상태로 진행한다.
CREATE TABLE user (
id SERIAL PRIMARY KEY,
name VARCHAR(20),
age INT
);
3. DB 설정 초기화
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
// User 스키마 또는 User 테이블구조
type User struct {
Id int
Name string
Age int
}
var (
db *sql.DB
)
// DB 설정
func InitDB() {
host := "localhost"
port := 5432
name := "TEST"
user := "test_onwer"
password := "1234"
psqlconn := fmt.Sprintf("host=%s port=%d dbname=%s user=%s password=%s sslmode=disable",
host, port, name, user, password)
var err error
db, err = sql.Open("postgres", psqlconn)
if err != nil {
panic(err)
}
}
// DB 연결테스트
func ConnectTest() {
err := db.Ping()
if err != nil {
panic(err)
}
}
func main() {
InitDB()
ConnectTest()
defer db.Close()
}
4. create
데이터 생성
Prepare
: 다중쿼리나 실행을 위한 구문을 생성QueryRow
: 준비된 쿼리 구문을 입력받은 인자로 실행Scan
: 데이터베이스로 반환받은 columns 읽기
func Create(name string, age int) {
sqlStatement := `INSERT INTO user_test (name, age) VALUES ($1, $2) returning id`
stmt, err := db.Prepare(sqlStatement)
var id int64
err = stmt.QueryRow(name, age).Scan(&id)
if err != nil {
panic(err)
}
fmt.Println("create id :", id)
}
func main() {
InitDB()
Create("foo", 10)
Create("bar", 20)
defer db.Close()
}
create 결과
create id : 1
create id : 2
5. read
데이터 조회
func Read(userId int) {
sqlStatement := `SELECT "id", "name", "age" FROM "user_test" WHERE $1 = "id"`
rows, err := db.Query(sqlStatement, userId)
if err != nil {
panic(err)
}
defer rows.Close()
var id int
var name string
var age int
for rows.Next() {
err := rows.Scan(&id, &name, &age)
if err != nil {
panic(err)
}
fmt.Printf("id: %d, name: %v, age: %d\n", id, name, age)
}
}
func main() {
InitDB()
Read(1)
defer db.Close()
}
read 결과
id: 1, name: foo, age: 10
6. update
데이터 수정
func Update(id int64, user User) {
sqlStatement := `UPDATE user SET name=$2, age=$3 WHERE id=$1`
res, err := db.Exec(sqlStatement, id, user.Name, user.Age)
if err != nil {
panic(err)
}
rowsAffected, err := res.RowsAffected()
if err != nil {
panic(err)
}
fmt.Printf("Total rows/record affected %v\n", rowsAffected)
}
func main() {
InitDB()
Update(1, User{Name: "foo1", Age: 21})
Read(1)
defer db.Close()
}
update 결과
Total rows/record affected 1
id: 1, name: foo1, age: 21
7. delete
데이터 삭제
func Delete(id int64) {
sqlStatement := `DELETE FROM user WHERE id=$1`
res, err := db.Exec(sqlStatement, id)
if err != nil {
panic(err)
}
rowsAffected, err := res.RowsAffected()
if err != nil {
fmt.Println("Error while checking the affected rows.", err)
} else {
fmt.Println("Total rows/record affected", rowsAffected)
}
}
func main() {
InitDB()
Delete(2)
defer db.Close()
}
delete 결과
Total rows/record affected 1