2020. 3. 11. 21:42ㆍGo
Go에는 database/sql 패키지를 지원합니다. 그래서 다른 DB들도 이 함수로 커버가 가능합니다.
간단하게 Sqlite를 연동해 사용하는 프로그램을 작성해보도록 하겠습니다.
파일 분할 database.go
데이터베이스의 원활한 사용을 위해 database.go 파일을 만들어줍니다. 그리고, 아래 코드를 추가해주세요.
package main
import (
"database/sql"
"errors"
"log"
_ "github.com/mattn/go-sqlite3"
)
sqlite3 패키지를 추가하는데 왜 ' _ ' 가 붙는지 이유가 궁금하시면 참고 하시면 좋을것 같습니다.
Sqlite 데이터베이스 파일을 열고, 테이블을 생성하는 함수를 작성하겠습니다.
func InitDB(file string) (*sql.DB, error) {
db, err := sql.Open("sqlite3", file)
if err != nil {
return nil, err
}
createTableQuery := `
create table IF NOT EXISTS useraccount (
id integer PRIMARY KEY autoincrement,
userId text,
password text,
UNIQUE (id, userId)
)
`
_, e := db.Exec(db, createTableQuery)
if e != nil {
return nil, e
}
return db, nil
}
데이터베이스를 열려면 sql.Open 함수를 사용하여 데이터베이스 종류를 적은뒤, 파일 이름을 적으면 열려지고 반환은 데이터베이스 포인터가 반환이됩니다. 그리고 db.Exec 함수를 통하여 쿼리를 적용할 수 있습니다.
다음은, 테이블에 데이터를 삽입하는 함수를 만들어보겠습니다.
프리페어를 통해 변수들을 삽입 쿼리에 적용하는데, 기존의 스트링으로 추가하면 제대로작동이 안되니 Prepare 함수를 잘 활용해야하겠습니다.
func AddUser(db *sql.DB, id string, password string) error {
tx, _ := db.Begin()
stmt, _ := tx.Prepare("insert into useraccount (userId,password) values (?,?)")
_, err := stmt.Exec(id, password)
if err != nil {
log.Println(err.Error())
return err
}
tx.Commit()
return nil
}
이렇게 쿼리 작업중에 생기는 에러는 패닉되지 않기 때문에 잘 처리 해주는것이 중요합니다. 디버깅때는 에러 로그를 남겨서 빠르게 찾도록 합시다.
Select 쿼리를 사용해 값을 받아오도록 하겠습니다.
쿼리 결과의 Scan으로 값을 복사합니다.
func GetUser(db *sql.DB, userId string) (User, error) {
var user User
rows := db.QueryRow("select * from useraccount where userId = $1", userId)
err := rows.Scan(&user.Id, &user.UserId, &user.Password)
if err != nil {
return User{}, err
}
return user, nil
}
QueryRow함수를 사용하면 검색되는 한개의 열만 가져오고, 존재하지 않을시에 에러를 리턴함으로써 간편하게 사용할 수 있습니다.
main.go에서 아래와 같이 사용해주시면 될것같습니다.
package main
func main() {
db, err := InitDB(".hello.db")
if err != nil {
log.Fatal(err)
}
}
감사합니다
'Go' 카테고리의 다른 글
Setting up Go develop environment for Beginners (0) | 2020.04.18 |
---|---|
C# WebSocket-Sharp, Make it more smart (0) | 2020.04.13 |
C# The way to make Real-time audio communication RTC in WPF with WebSocket-Sharp (0) | 2020.04.12 |
[Go] 구조체와 errors를 이용, 은행 계좌 만들기 (0) | 2020.02.09 |
[Go] Go Routine과 Channel 사용 (1) | 2020.02.09 |