위와 같은 에러는 main함수의 os.Getenv()에서 발생하여
m := app.MakeHandler("발급받은 Postgre URL")
이런식으로 해결했습니다.
그 후 git add, commit, push 후 heroku -logs --tail을 사용하여 정상적으로 작동하는지 로그를 확인해 줍니다.
postgre에서는 '?'를 지원하지 않는다는 의미인데, postgre ?가 아닌 $와 숫자를 사용해야 합니다.
func (s *pqHandler) GetTodos(sessionId string) []*Todo {
todos := []*Todo{}
rows, err := s.db.Query("SELECT id, name, completed, createdAt FROM todos sessionId=$1", sessionId)
...
}
func (s *pqHandler) AddTodo(name string, sessionId string) *Todo {
stmt, err := s.db.Prepare("INSERT INTO todos (sessionId, name, completed, createdAt) VALUES ($1, $2, $3, now()")
...
}
func (s *pqHandler) RemoveTodo(id int) bool {
stmt, err := s.db.Prepare("DELETE FROM todos WHERE id=$1")
...
}
func (s *pqHandler) CompleteTodo(id int, complete bool) bool {
stmt, err := s.db.Prepare("UPDATE todos SET completed=$1 WHERE id=$2")
...
}
이렇게 바꾸어 줍니다.
그 후 git add, commit, push 후 서버를 실행해주면 정상적으로 add와 update가 되는 것을 확인할 수 있습니다.
그런데 여기서 DELETE가 되지 않습니다. 그 이유는 Postgre에서 LastInsertId()를 지원하지 않기 때문에 그런것인데 아래와 같이
코드를 수정해줍니다.
func (s *pqHandler) AddTodo(name string, sessionId string) *Todo {
stmt, err := s.db.Prepare("INSERT INTO todos (sessionId, name, completed, createdAt) VALUES ($1, $2, $3, now()) RETURNING id")
if err != nil {
panic(err)
}
var id int
err = stmt.QueryRow(sessionId, name, false).Scan(&id)
if err != nil {
panic(err)
}
// id, _ := rst.LastInsertId()
var todo Todo
todo.ID = id
todo.Name = name
todo.Completed = false
todo.CreatedAt = time.Now()
return &todo
}
LastInsertId()를 지원하지 않는 이유는 insert 된 게 정확한 id가 아니기 때문이라고 합니다.
그래서 insert 한 뒤에 RETURNING id으로 id정보를 return할 수 있게 만들어주고, 그 다음에 QueryRow()바꾸고, 결과로 SqlRow()가 나온다. 이것이 id값으로 가지고 있을 것인데 그것을 Scan()해서 id변수를 집어넣어서 id값을 채워주도록 수정했습니다.
그래서 그 id값을 LastInsertId()가 아닌 아까 만들었던 id 변수를 넣어서 제대로된 id값을 가져올 수 있게 되었습니다.
저장 후에 git add, commit, push후에 heroku를 open 해줍니다.
여기까지 간단하지만 Todos라는 Web Service를 배포했고, database까지 추가했습니다.
'프로그래밍(Web) > Golang' 카테고리의 다른 글
[바미] Go 1.16 Release 정보! (0) | 2021.02.25 |
---|---|
[바미] Go - Websocket (0) | 2020.12.18 |
[바미] Go - PostgreDB (0) | 2020.12.18 |
[바미] Go - todos 배포 (0) | 2020.12.18 |
[바미] Go - HEROKU를 사용한 웹 호스팅 (0) | 2020.12.17 |