퀵스타트: go-mssqldb로 연결 및 쿼리

이 퀵스타트에서는 Go에서 SQL Server 데이터베이스에 연결해 쿼리를 실행합니다. 표준 go-mssqldb 패키지와 함께 database/sql 드라이버를 사용합니다.

Prerequisites

이 글의 주요 샘플을 위해서는 다음과 같은 것이 필요합니다:

로컬 SQL Server 인스턴스 대신 Azure SQL에 연결한다면, Azure 특유 전제 조건과 설정에 go-mssqldb with Azure SQL Database를 사용하세요.

시작점 선택

이 글의 주요 샘플은 통합 인증이 적용된 Windows의 로컬 SQL Server 인스턴스를 사용합니다. Linux나 macOS를 사용 중이거나 Azure SQL에 연결한다면 이 글 후반부에서 SQL 인증 또는 Microsoft Entra ID 변형을 사용하세요.

  • SQL Server에 대한 가장 작은 종단 투 엔드 샘플을 원한다면 이 글을 계속 읽으시면 로컬 테스트 데이터베이스를 만들 수 있습니다.
  • Windows 인증 대신 SQL Server 로그인으로 접속한다면, 이 글을 계속 참고하시고 나중에 SQL 인증 변형을 사용하세요.
  • Azure SQL Database, Azure SQL Managed Instance, 또는 Fabric에서 SQL 데이터베이스에 연결하고 있다면, 먼저 Azure SQL Database에서 go-mssqldb를 사용하세요. 그 기사는 Azure TLS 요구사항, 연결 제한, 비밀번호 없는 인증에 대해 다룹니다.
  • Microsoft Entra ID를 사용 중이라면 github.com/microsoft/go-mssqldb/azuread를 가져와서 azuresql 드라이버 이름을 사용하세요. 자격 증명 흐름 세부 사항은 Microsoft Entra ID 인증을 참조하세요.

Go 프로젝트 만들기

  1. 새 디렉터리 생성 및 초기화:

    mkdir go-sql-quickstart
    cd go-sql-quickstart
    go mod init go-sql-quickstart
    
  2. 드라이버 설치:

    go get github.com/microsoft/go-mssqldb
    

연결 및 쿼리

다음과 같은 Go 코드로 이름을 main.go 가진 파일을 생성합니다:

package main

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

    _ "github.com/microsoft/go-mssqldb"
)

func main() {
    // Build the connection string.
    connString := "sqlserver://<server>?database=AdventureWorks2025&trusted_connection=yes"

    // Open and verify the connection.
    db, err := sql.Open("sqlserver", connString)
    if err != nil {
        log.Fatal("Error opening connection: ", err.Error())
    }
    defer db.Close()

    if err = db.PingContext(context.Background()); err != nil {
        log.Fatal("Error pinging database: ", err.Error())
    }
    fmt.Println("Connected to SQL Server.")

    // Run a SELECT query.
    rows, err := db.QueryContext(context.Background(),
        "SELECT DepartmentID, Name, GroupName FROM HumanResources.Department")
    if err != nil {
        log.Fatal("Error running query: ", err.Error())
    }
    defer rows.Close()

    // Iterate through the results.
    fmt.Println("\nDepartments:")
    for rows.Next() {
        var id int
        var name, groupName string
        if err := rows.Scan(&id, &name, &groupName); err != nil {
            log.Fatal("Error scanning row: ", err.Error())
        }
        fmt.Printf("  %d: %s (%s)\n", id, name, groupName)
    }
    if err = rows.Err(); err != nil {
        log.Fatal("Error after row iteration: ", err.Error())
    }
}

애플리케이션을 실행합니다.

go run main.go

예상 출력:

Connected to SQL Server.

Departments:
  1: Engineering (Research and Development)
  2: Tool Design (Research and Development)
  3: Sales (Sales and Marketing)
  4: Marketing (Sales and Marketing)
  ...

한 줄을 삽입하세요

다음 함수를 main.go에 추가하고 main()에서 호출합니다:

func insertDepartment(db *sql.DB, name, groupName string) (int64, error) {
    ctx := context.Background()
    result, err := db.ExecContext(ctx,
        "INSERT INTO HumanResources.Department (Name, GroupName) VALUES (@p1, @p2)",
        sql.Named("p1", name),
        sql.Named("p2", groupName))
    if err != nil {
        return 0, err
    }
    return result.RowsAffected()
}

Important

드라이버는 go-mssqldb를 지원하지 않습니다. LastInsertId() 호출하면 오류가 발생합니다. 삽입된 IDENTITY 값을 가져오려면 OUTPUT 절 또는 별도의 SELECT SCOPE_IDENTITY() 쿼리를 사용하세요.

SQL 인증 사용

Windows 인증 대신 SQL Server 인증으로 연결하려면 연결 문자열을 변경하세요. 모든 연결 문자열 형식과 옵션에 대해서는 Connection strings를 참조하세요.

connString := "sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025"

Microsoft Entra ID 사용

Azure SQL Database, Azure SQL Managed Instance, 또는 Fabric에서 SQL 데이터베이스에 연결하고 있다면, 먼저 Azure SQL Database에서 go-mssqldb를 사용하세요. 이 절의 예시는 에서 필요한 main.go최소 코드 변경만을 보여줍니다.

Microsoft Entra ID를 사용해 인증하려면 패키지를 azuread 가져오세요:

import (
    _ "github.com/microsoft/go-mssqldb/azuread"
)

그런 다음 azuresql 드라이버 이름을 사용하고 연결 문자열에 fedauth을 추가하세요. 모든 Microsoft Entra 옵션에 대해서는 Microsoft Entra ID 인증을 참조하세요.

db, err := sql.Open("azuresql", "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false")