to do list 의 여러 정보들을 저장하기 위해 Database를 사용한다.
우선 MySQL을 설치하고 MySQL Command Line Client를 실행시킨다.
root로 로그인하고 tododb 라는 database를 생성한다.
CREATE DATABASE tododb;
Table 생성은 todolib/mysql.go 에서 처리해보았다.
func DbInit() {
db, err := sql.Open("mysql", "root:0000@tcp(127.0.0.1:3306)/tododb")
if err != nil {
log.Fatal(err)
}
defer db.Close()
log.Println("db open complete")
_, err = db.Exec("DROP TABLE IF EXISTS version")
if err != nil {
log.Fatal(err)
}
log.Println("db drop complete")
_, err = db.Exec("CREATE TABLE version (id serial PRIMARY KEY, version VARCHAR(10), name VARCHAR(10), updateTime INTEGER)")
if err != nil {
log.Fatal(err)
}
log.Println("db table create complete")
}
sql.Open으로 db파일을 열고 이미 생성되어있는 version table이 있으면 제거한 뒤 새로운 version table을 생성한다.
최신 어플리케이션의 apk 파일이 업데이트 되면 version table도 업데이트 시켜, client가 현재 버전과 최신 버전을 비교할 수 있도록 한다.
column 목록은 id, version, name, updateTime 이 있다.
id는 해당 데이터(row)의 기본 KEY이고, updateTime은 업데이트 시간(UNIX time)을 기록하기 위해 INTEGER형을 사용했는데, 추후 modify 명령으로 string을 사용할 수 있다.
생성된 테이블에 데이터를 입력하는 함수에서도 마찬가지로 sql.Open() 함수로 db를 열고,
result, err := db.Exec("INSERT INTO version(version, name, updateTime) VALUES (?, ?, ?)",arg.Version, arg.Name, arg.UpdateTime)
if err != nil {
log.Fatal(err)
}
INSERT 명령으로 데이터를 입력한다. '?' 기호를 C언어의 형식자처럼 사용할 수 있다.
입력한 데이터를 불러오는 방법은 Select 명령을 사용한다.
var getData string
err = db.QueryRow("SELECT " + col + " FROM "+ table +" ORDER BY id DESC").Scan(&getData)
if err != nil {
log.Fatal(err)
}
return getData
어떤 테이블에서 어떤 column의 데이터가 필요한지 매개변수로 받아, SELECT 한다.
이 때, 마지막으로 업데이트된 버전의 데이터가 필요하니 ORDER BY id DESC조건으로 내림차순으로 정렬된 id 중 첫번째 행의 데이터만 불러온다.
최신 버전을 가지고 있는 행을 제외한 나머지 행을 모두 제거한다.
_, err = db.Exec("DELETE FROM version WHERE version != ?", arg)
if err != nil {
log.Fatal(err)
}
최신 버전을 매개변수로 받아서 WHERE 조건문으로 사용한다.