>  기사  >  백엔드 개발  >  알 수 없는 테이블 스키마를 사용하여 Go에서 "SELECT *" 열을 []문자열로 읽는 방법은 무엇입니까?

알 수 없는 테이블 스키마를 사용하여 Go에서 "SELECT *" 열을 []문자열로 읽는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-11 12:01:02984검색

How to Read

Go에서 "SELECT *" 열을 []String으로 읽는 방법

Go에서는 SQL의 도움으로 데이터베이스에서 행을 가져올 수 있습니다. 패키지에서 이러한 행을 조작하고 CSV와 같은 파일에 쓰는 작업은 csv 패키지를 사용하여 수행할 수 있습니다. 그러나 테이블의 스키마를 알 수 없고 동적으로 결정해야 하는 경우 한 가지 문제가 발생합니다.

문제: 알 수 없는 테이블 스키마

행 유형의 Scan 메서드는 필드가 다음과 같을 것으로 예상합니다. 테이블의 스키마를 기반으로 하는 특정 유형. 이 스키마에 대한 사전 지식이 없으면 존재하는 열 수와 해당 유형이 무엇인지 확인하기가 어렵습니다. 이는 열을 []문자열과 같은 일반 유형으로 읽으려고 할 때 문제가 됩니다.

해결책: 인터페이스 유형 사용

이 문제를 극복하려면 []인터페이스{} 슬라이스 []문자열 슬라이스의 각 문자열을 가리키는 데 사용할 수 있습니다. 이는 Scan이 대상 변수에 대한 포인터 배열을 기대하기 때문에 필요합니다. 다음 코드 조각은 이 접근 방식을 보여줍니다.

package main

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

func main() {
    // Establish a connection to the database.
    db, err := sql.Open("mysql", "user:pass@tcp(localhost:3306)/test")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Execute the "SELECT *" query.
    rows, err := db.Query("SELECT * FROM my_table")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    // Get the column names.
    cols, err := rows.Columns()
    if err != nil {
        log.Fatal(err)
    }

    // Create an interface{} slice pointing to each string in the []string slice.
    var readCols = make([]interface{}, len(cols))
    var writeCols = make([]string, len(cols))
    for i, _ := range writeCols {
        readCols[i] = &writeCols[i]
    }

    // Iterate over the rows and scan the columns into the string slice.
    for rows.Next() {
        if err := rows.Scan(readCols...); err != nil {
            log.Fatal(err)
        }
        fmt.Println(writeCols)
    }
}

이 예에서 readCols 슬라이스에는 writeCols 슬라이스의 각 요소에 대한 포인터가 포함되어 있습니다. Scan이 호출되면 행의 값이 readCols가 가리키는 변수에 할당되고 이후에 writeCols 슬라이스에 복사됩니다. 이를 통해 데이터베이스의 열을 문자열 조각으로 동적으로 읽을 수 있습니다.

위 내용은 알 수 없는 테이블 스키마를 사용하여 Go에서 "SELECT *" 열을 []문자열로 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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