Go 및 PostgreSQL 및 pgx 및 squirrel 라이브러리
응용 프로그램과 데이터베이스는 우유와 과자처럼 밀접하게 연결되어 있다.오늘의 메뉴에는 시원한 Go 우유가 뿌려진 Postgre SQL 맛의 과자가 있다.나는 Aiven PostgreSQL 서비스를 어떻게 연결하고 사용하는지 보여주기 위해 내가 가장 좋아하는 Go 라이브러리 두 개를 선택했다.이 라이브러리들은 pgx입니다. 이것은
database/sql
와 Squirrel의 괜찮은 PostgreSQL의 특정 대체품입니다. 왜냐하면 저는 이 이름을 좋아하기 때문입니다.데이터베이스 시작
만약 수중에 PostgreSQL 데이터베이스가 하나 있다면 이상적인 상황은 그 안에 일부 데이터가 포함되어 있다는 것이다. 이것은 일리가 있는 것이다.Aiven 계정이 없으면 sign up PostgreSQL 서비스를 시작합니다.만약 네가 이미 사용할 수 있는 데이터가 좀 있다면, 정말 좋겠다.나는 지금 케플러 우주 임무의 일부 개방 데이터를 사용하고 있는데, 너는 follow along with the recent blog post 스스로 설정할 수 있다.
Aiven 콘솔에서 Postgres의 연결 문자열을 복사하거나 다른 데이터베이스를 사용하는 경우 연결 문자열
postgres://....
을 복사합니다.Go에서 PostgreSQL로 연결
Go는
database/sql
라이브러리에 내장된 데이터베이스 지원을 가지고 있지만, 이렇게 많은 데이터베이스 플랫폼을 처리할 수 있어야 하기 때문에 매우 통용된다.PostgreSQL에 전문적으로 연결된 응용 프로그램에 대해 전문가 라이브러리를 사용하는 것은 의미가 있다.이 예시에 대해 나는
jackc/pgx
를 선택했다. 이것은 PostgreSQL에 특정된 것이고 성능을 향상시키는 것 외에 PostgreSQL 데이터 유형을 이해하는 좋은 특성도 가지고 있다.전체적인 패턴은 사용database/sql
의 다른 응용 프로그램과 근본적으로 다르지 않아 익숙하게 느껴진다.이전에 복사한 연결 문자열을
DATABASE_URL
환경 변수로 설정합니다.그리고 go mod init pgfun
로 고 신청을 초기화하기;pgx
고모듈을 사용합니다.모든 내용을 설정한 후 다음 코드 예시를 데이터베이스에 연결하고 조회를 실행하십시오. (내 데이터베이스에 계외행성 데이터가 있습니다.)
package main
import (
"context"
"fmt"
"os"
"github.com/jackc/pgx/v4/pgxpool"
)
func main() {
dbpool, dberr := pgxpool.Connect(context.Background(), os.Getenv("DATABASE_URL"))
if dberr != nil {
panic("Unable to connect to database")
}
defer dbpool.Close()
sql := "SELECT kepler_name, koi_score " +
"FROM cumulative " +
"WHERE kepler_name IS NOT NULL AND koi_pdisposition = 'CANDIDATE' " +
"ORDER BY koi_score LIMIT 5"
rows, sqlerr := dbpool.Query(context.Background(), sql)
if sqlerr != nil {
panic(fmt.Sprintf("QueryRow failed: %v", sqlerr))
}
for rows.Next() {
var planet_name string
var score float64
rows.Scan(&planet_name, &score)
fmt.Printf("%s\t%.2f\n", planet_name, score)
}
}
main()
함수에서 먼저 코드pgx
의connection pool 기능을 사용하여 데이터베이스에 연결한다.일반적으로 PostgreSQL을 위해 연결 탱크를 구축하는 것은 현명한 조치라고 생각하는데, 이것이 바로 왜 이곳에서 그것을 사용하는가이다.그 다음은 케플러 임무가 지정한 외계행성의'후보'상태와 이것이 실제 행성이라는 믿음을 보여주는 간단한 SQL 문구이다.이 문장은 한 줄의 제한이 있습니다. (데이터 집합은 약 2k줄에 제한이 없습니다.) 따라서 마지막 절에서는 다섯 개의 최저 신뢰도 평점 행성만 볼 수 있습니다. 이 줄을 옮겨다니며 데이터를 변수로 읽을 수 있습니다.
나는 이곳의 이름을 좋아한다. 만약 네가 흥미가 있다면, 너는 심지어 Exoplanet Catalogue 에서 행성을 찾을 수 있다.나는 너무 많은 시간을 들여서 훑어보았는데, 과학은 으뜸이었다.
요컨대, 우리는 PostgreSQL 연결 문자열, Go 데이터베이스 라이브러리, 하드코딩된 SQL 조회가 있다.다음은요?
유체와 다람쥐의 인터페이스
pgx
라이브러리는 database/sql
PostgreSQL에 특정된 대체품이지만 호환되는 인터페이스도 있다.기존 응용 프로그램을 전환하는 것은 이상적인 선택이지만, 이것은 다른 설계된 도구database/sql
도 pgx
와 함께 사용할 수 있다는 것을 의미한다.이것은 나에게 좋은 소식이다. 왜냐하면 나는 하드코딩 SQL 문자열보다 더 우아한 것을 찾고 싶기 때문이다.다람쥐!
아니오, 저는 신경을 쓰지 않았습니다. 이것은 SQL 라이브러리입니다.그럼에도 불구하고 그것은 약간 반짝이는 장난감 같다.이것은 SQL 조회를 구축하는 데 사용되는 유동 인터페이스로 이런 방식으로 생각하기에 매우 적합하다.
이 인터페이스에서 기존 SQL 쿼리를 재구성하면 다음과 같은 결과가 발생합니다.
planets := psql.Select("kepler_name", "koi_score").
From("cumulative").
Where(sq.NotEq{"kepler_name": nil}).
Where(sq.Eq{"koi_pdisposition": "CANDIDATE"}).
OrderBy("koi_score").
Limit(5)
그것은 관리하기 쉽고, SQL 문자열을 연결하는 것보다 실제 응용 프로그램에서 구축하는 것이 훨씬 쉽다고 상상할 수 있다.문자열로 구축된 SQL을 호출 planets.ToSql()
을 통해 확인할 수 있습니다. 이것은 좋은 작업입니다.pgx
에서'가장database/sql
'모드로 전환하려면 재구성이 필요합니다.다람쥐가PostgreSQL에서 잘 놀 수 있도록 비장 한 숟가락이 필요합니다. 다음은 완전한runnable 예시입니다.데이터베이스 연결 문자열이 DATABASE_URL
에 있어야 합니다. 이전 예제에서 볼 수 있듯이package main
import (
"database/sql"
"fmt"
"os"
sq "github.com/Masterminds/squirrel"
_ "github.com/jackc/pgx/v4/stdlib"
)
func main() {
db, err := sql.Open("pgx", os.Getenv("DATABASE_URL"))
if err != nil {
panic("Unable to connect to database")
}
defer db.Close()
// a little magic to tell squirrel it's postgres
psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)
planets := psql.Select("kepler_name", "koi_score").
From("cumulative").
Where(sq.NotEq{"kepler_name": nil}).
Where(sq.Eq{"koi_pdisposition": "CANDIDATE"}).
OrderBy("koi_score").
Limit(5)
rows, sqlerr := planets.RunWith(db).Query()
if sqlerr != nil {
panic(fmt.Sprintf("QueryRow failed: %v", sqlerr))
}
for rows.Next() {
var planet_name string
var score float64
rows.Scan(&planet_name, &score)
fmt.Printf("%s\t%.2f\n", planet_name, score)
}
}
pgx
가져오는 것은 Squirrel이 database/sql
방법에서 원하는 RunWith()
호환 라이브러리를 얻기 위해 다른 것입니다.연결 절차도 약간의 변화가 있기 때문에 앞의 예시를 수정하려고 하지 마세요.이건 달라.psql
변수는 새로 설정된 squirrel을 포함하는데, 이것은 PostgreSQL 처리 차지 문자의 방식이 약간 다르기 때문이다.이 옵션을 건너뛰면 코드가 자구 근처에 문법 오류가 있음을 알려 줍니다.지금 나는 이미 썼으면 좋겠다. 나의 사랑하는 독자들이 이 문제를 피할 수 있기를 바란다. 다음에 나는 심지어 이것을 기억할 것이다.Go와 PostgreSQL의 즐거움
이것은 경량급 소개로 제가 가장 좋아하는 Go와 PostgreSQL 응용 프로그램 라이브러리 두 개를 보여 줍니다. 물론 개방된 데이터 집합이 있어 즐거움이 배가됩니다:)
여기에 관련 링크와 진일보한 읽기가 있습니다. 문제가 있으면 저희에게 연락 주십시오.우리는 항상 즐겁게 이야기를 나눈다.
Reference
이 문제에 관하여(Go 및 PostgreSQL 및 pgx 및 squirrel 라이브러리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lornajane/go-and-postgresql-with-pgx-and-squirrel-libraries-25jo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)