Go 및 QuestDB로 API를 구축하는 방법
20528 단어 questdbgoprogrammingtutorial
QuestDB에 익숙하지 않은 경우 여기demo link로 문의하십시오.
이 자습서에서는 간단한 API를 빌드하고 프로젝트에서 시계열 데이터베이스로 QuestDB를 구현합니다. 그런 다음 HTTP 경로를 처리하기 위해 Gin Framework을 사용합니다.
시작하기 전에 다음과 같이 가정합니다.
QuestDB 실행
먼저 로컬에서 QuestDB를 실행해야 합니다. 설치 방법에는 여러 가지가 있습니다. here 에서 찾을 수 있습니다. 그러나 우리는 편의를 위해 Docker와 최신 questdb Docker 이미지를 사용할 것입니다.
Docker를 통해 QuestDB를 시작하려면 다음을 실행합니다.
docker run -p 9000:9000 \
-p 9009:9009 \
-p 8812:8812 \
questdb/questdb
또는 macOS 사용자는 Homebrew를 사용할 수 있습니다.
brew install questdb
brew services start questdb
QuestDB를 시작한 후 웹 콘솔을 포트
9000
에서 사용할 수 있으므로 localhost:9000
로 이동하면 다음과 같은 UI가 표시됩니다.자, QuestDB가 준비되었습니다. 이제 다음 단계를 시작하겠습니다.
Gin과 Gorm을 사용하여 Go에서 REST API 구축
프로젝트의 종속성을 관리하기 위해 새로운 Go 모듈을 초기화하는 것부터 시작하겠습니다.
go mod init
이제 필요한 종속성을 설치하겠습니다.
go get -u github.com/joho/godotenv
go get -u gorm.io/gorm
go get -u github.com/gin-gonic/gin
설치가 완료되면 폴더에
go.mod
및 go.sum
가 있어야 합니다. 두 파일 모두 우리가 설치한 패키지의 정보를 포함합니다.참고로 내 github에 전체 소스 코드를 게시했습니다. 자유롭게 복제하십시오.
git clone https://github.com/arifintahu/go-api-questdb
데이터베이스 설정
데이터베이스 연결 및 모델을 생성하여 시작하겠습니다.
// models/tracker.go
package models
import (
"time"
)
type Tracker struct {
Timestamp time.Time `gorm:"type:timestamp" json:"timestamp"`
VehicleId int `gorm:"type:int" json:"vehicleId"`
Latitude float64 `gorm:"type:double" json:"latitude"`
Longitude float64 `gorm:"type:double" json:"longitude"`
}
차량의 모든 위치를 기록하는 모델
tracker
이 있습니다. 각 트래커에는 타임스탬프, 정수 유형의 VehicleId, 부동 유형의 위도 및 경도가 있어야 합니다. 유형이 QuestDB 유형에서 사용 가능한지 여부를 고려해야 합니다here.다음으로 데이터베이스에 연결하기 위한 설정 함수를 생성합니다. Web Console, InfluxDB Line Protocol, PostgreSQL Wire Protocol, HTTP REST API와 같은 다양한network endpoints에 연결하여 QuestDB 데이터베이스와 상호 작용할 수 있습니다.
우리는 golang에서 gorm을 ORM으로 사용할 수 있기 때문에 포트
8812
에 연결하여 PostgreSQL Wire Protocol을 사용할 것입니다. 그 전에 Postgres 드라이버를 사용하여 QuestDB를 연결하기 때문에 gorm 드라이버 postgres를 설치해야 합니다.go get -u gorm.io/driver/postgres
그런 다음 데이터베이스 연결을 위한 함수를 작성합니다.
// models/setup.go
package models
import (
"fmt"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
var DB *gorm.DB
type DBConfig struct {
Host string
User string
Password string
Name string
Port string
}
func (dbConfig *DBConfig) ConnectDatabase() error {
dsn := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s",
dbConfig.Host,
dbConfig.User,
dbConfig.Password,
dbConfig.Name,
dbConfig.Port,
)
database, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
return err
}
database.AutoMigrate(&Tracker{})
DB = database
return nil
}
setup.go
에서 tracker
모델에 대한 자동 마이그레이션도 정의합니다. 따라서 먼저 데이터베이스에 테이블을 만들 필요가 없습니다.쓰기 컨트롤러
다음으로 트래커를 만들고 찾을 수 있는 간단한 컨트롤러를 빌드합니다.
// controllers/trackers.go
package controllers
import (
"go-api-questdb/models"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
type CreateTrackerInput struct {
VehicleId int `json:"vehicleId"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
}
func CreateTracker(c *gin.Context) {
var input CreateTrackerInput
if err:= c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"data": err.Error()})
return
}
tracker := models.Tracker{
Timestamp: time.Now().UTC(),
VehicleId: input.VehicleId,
Latitude: input.Latitude,
Longitude: input.Longitude,
}
models.DB.Create(&tracker)
c.JSON(http.StatusOK, gin.H{"data": tracker})
}
func GetTrackers(c *gin.Context) {
var trackers []models.Tracker
models.DB.Find(&trackers)
c.JSON(http.StatusOK, gin.H{"data": trackers})
}
트래커 컨트롤러에는
CreateTrackerInput
핸들러에서 요청 본문의 유효성을 검사하기 위한 CreateTracker
가 있습니다. 그런 다음 DB 인스턴스를 호출하여 행 생성을 실행합니다. 또한 모든 행을 가져오는 처리기GetTrackers
가 있습니다.RESTful 경로
거의 다 왔습니다!
마지막으로 해야 할 일은 경로 처리기와 응용 프로그램 진입점을 만드는 것입니다.
// main.go
package main
import (
"go-api-questdb/controllers"
"go-api-questdb/models"
"os"
"github.com/gin-gonic/gin"
_ "github.com/joho/godotenv/autoload"
)
func main() {
r := gin.Default()
dbConfig := models.DBConfig{
Host: os.Getenv("DB_HOST"),
User: os.Getenv("DB_USER"),
Password: os.Getenv("DB_PASSWORD"),
Name: os.Getenv("DB_NAME"),
Port: os.Getenv("DB_PORT"),
}
err := dbConfig.ConnectDatabase()
if err != nil {
panic(err)
}
r.POST("/trackers", controllers.CreateTracker)
r.GET("/trackers", controllers.GetTrackers)
r.Run("localhost:3000")
}
main.go
에는 데이터베이스 연결을 초기화하기 위한 dbConfig
가 있고 .env
파일에 데이터베이스 자격 증명을 로드합니다. 따라서 프로젝트에 .env
파일을 추가해야 합니다.명시된 대로 QuestDB의 기본 사용자 및 암호를 사용합니다here.
// .env
DB_HOST=localhost
DB_USER=admin
DB_PASSWORD=quest
DB_NAME=qdb
DB_PORT=8812
좋아, API를 실행하자
go run main.go
좋습니다. 앱이
localhost:3000
에서 성공적으로 실행되고 있으며 새 테이블을 성공적으로 마이그레이션하고 있습니다.POST
요청을 localhost:3000/trackers
에 전송하여 테스트해 보겠습니다.curl --request POST 'localhost:3000/trackers' --header 'Content-Type: application/json' --data-raw '{ "vehicleId": 1, "latitude": -7.626923, "longitude": 111.5213978 }'
그럼 우리는 얻었다
{
"data": {
"timestamp": "2022-09-09T09:56:01.8970862Z",
"vehicleId": 1,
"latitude": -7.626923,
"longitude": 111.5213978
}
}
GET
요청을 localhost:3000/trackers
에 전송하여 다시 테스트해 보겠습니다.{
"data": [
{
"timestamp": "2022-09-09T09:56:01.8970862Z",
"vehicleId": 1,
"latitude": -7.626923,
"longitude": 111.5213978
}
]
}
네, Go 및 QuestDB로 API를 성공적으로 구축했습니다 🌟 🌟 🌟
Reference
이 문제에 관하여(Go 및 QuestDB로 API를 구축하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/arifintahu/how-to-build-api-with-go-and-questdb-19ld텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)