クイックスタート:go-mssqldbで接続・クエリ

このクイックスタートでは、GoからSQL Serverデータベースに接続してクエリを実行します。 標準のgo-mssqldbパッケージでdatabase/sqlドライバーを使用します。

前提条件

この記事の主なサンプルには、以下が必要です:

  • 1.25以降にしてください
  • SQL Server互換エンドポイントへのアクセス。 メインサンプルは、Windows上のローカルSQL Serverインスタンスを前提としています。
  • AdventureWorks2025 サンプル データベース。 ダウンロードおよび復元の手順については、 AdventureWorksのサンプルデータベースをご覧ください。

ローカルのSQL ServerインスタンスではなくAzure SQLに接続する場合は、Azure固有の前提条件と設定のためにAzure SQL Databaseでgo-mssqldbを使いましょう。

出発点を選択する

この記事の主なサンプルは、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 Databaseに接続する場合は、まず「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()をサポートしていません。 呼び出すとエラーが返されます。 挿入された識別値を取得するには、別 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 Databaseに接続する場合は、まず「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")