>  기사  >  백엔드 개발  >  Go의 STDIN에서 PostgreSQL로 행을 가져오는 방법은 무엇입니까?

Go의 STDIN에서 PostgreSQL로 행을 가져오는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-24 14:20:53865검색

How to Import Rows to PostgreSQL from STDIN in Go?

STDIN에서 PostgreSQL로 행 가져오기

Python에서 subprocess 모듈은 COPY를 사용하여 STDIN에서 PostgreSQL에 데이터를 쓰는 편리한 방법을 제공합니다. 명령. 그러나 Go에서 이와 동일한 기능을 달성하려면 다른 접근 방식이 필요합니다.

github.com/lib/pq 패키지의 공식 문서에는 CopyIn 기능을 사용하여 STDIN에서 직접 레코드를 가져오는 방법에 대한 예가 나와 있습니다. 다음은 제공된 코드의 수정된 버전입니다.

<code class="go">package main

import (
    "database/sql"
    "fmt"
    "log"

    "github.com/lib/pq"
)

func main() {
    records := [][]string{
        {"Rob", "Pike"},
        {"Ken", "Thompson"},
        {"Robert", "Griesemer"},
    }

    db, err := sql.Open("postgres", "dbname=postgres user=postgres password=postgres")
    if err != nil {
        log.Fatalf("open: %v", err)
    }
    if err = db.Ping(); err != nil {
        log.Fatalf("open ping: %v", err)
    }
    defer db.Close()

    txn, err := db.Begin()
    if err != nil {
        log.Fatalf("begin: %v", err)
    }

    stmt, err := txn.Prepare(pq.CopyIn("test", "first_name", "last_name"))
    if err != nil {
        log.Fatalf("prepare: %v", err)
    }

    for _, r := range records {
        _, err = stmt.Exec(r[0], r[1])
        if err != nil {
            log.Fatalf("exec: %v", err)
        }
    }

    _, err = stmt.Exec()
    if err != nil {
        log.Fatalf("exec: %v", err)
    }

    err = stmt.Close()
    if err != nil {
        log.Fatalf("stmt close: %v", err)
    }

    err = txn.Commit()
    if err != nil {
        log.Fatalf("commit: %v", err)
    }

    log.Println("Records successfully imported")
}</code>

이 수정된 코드는 트랜잭션을 사용하여 가져오기 프로세스 중에 원자성, 일관성, 격리 및 내구성(ACID) 속성을 보장합니다. CopyIn 기능을 사용하면 대상 테이블 이름과 데이터가 삽입될 열을 지정할 수 있습니다.

제공된 샘플 데이터는 준비된 문을 사용하여 "테스트" 테이블에 삽입됩니다. 준비된 문은 SQL 쿼리를 미리 컴파일하여 구문 분석 및 계획과 관련된 오버헤드를 줄여 성능을 향상시킵니다.

모든 레코드가 삽입되면 트랜잭션이 커밋되고 데이터가 데이터베이스에 영구적으로 저장됩니다.

위 내용은 Go의 STDIN에서 PostgreSQL로 행을 가져오는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.