Delen via


Quickstart: Golang gebruiken om een query uit te voeren op een database in Azure SQL Database of Azure SQL Managed Instance

Van toepassing op:Azure SQL DatabaseAzure SQL Managed Instance

In deze quickstart gebruikt u de programmeertaal Golang om verbinding te maken met een Azure SQL-database of een database in Azure SQL Managed Instance, met het go-mssqldb-stuurprogramma . De voorbeeldquery's bewerken en wijzigen gegevens met expliciete Transact-SQL-instructies (T-SQL). Golang is een opensource-programmeertaal waarmee u eenvoudig eenvoudige, betrouwbare en efficiënte software kunt bouwen.

Vereiste voorwaarden

U hebt het volgende nodig om deze quickstart te voltooien:

Serververbindingsgegevens ophalen

Haal de verbindingsgegevens op die u nodig hebt om verbinding te maken met de database. Voor de komende procedures hebt u de volledig gekwalificeerde servernaam of hostnaam, databasenaam en aanmeldingsgegevens nodig.

  1. Meld u aan bij het Azure-portaal.

  2. Ga naar de pagina SQL Databases of SQL Managed Instances.

  3. Controleer op de pagina Overzicht de volledig gekwalificeerde servernaam naast servernaam voor een database in Azure SQL Database of de volledig gekwalificeerde servernaam (of het IP-adres) naast Host voor een Azure SQL Managed Instance of SQL Server op Azure VM. Als u de servernaam of hostnaam wilt kopiëren, plaatst u de muisaanwijzer erop en selecteert u het pictogram Kopiëren.

Opmerking

Zie Verbinding maken met een SQL Server-exemplaarvoor verbindingsgegevens voor SQL Server op azure-VM.

Een nieuwe map maken voor het Golang-project en afhankelijkheden

  1. Maak vanuit de terminal een nieuwe projectmap met de naam SqlServerSample.

    mkdir SqlServerSample
    

Voorbeeldgegevens maken

  1. Maak in een teksteditor een bestand met de naam CreateTestData.sql in de SqlServerSample map. Plak deze T-SQL-code in het bestand, waarmee een schema, tabel en een paar rijen worden gemaakt.

    CREATE SCHEMA TestSchema;
    GO
    
    CREATE TABLE TestSchema.Employees (
        Id INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
        Name NVARCHAR(50),
        Location NVARCHAR(50)
    );
    GO
    
    INSERT INTO TestSchema.Employees (Name, Location)
    VALUES (N'Jared', N'Australia'),
        (N'Nikita', N'India'),
        (N'Astrid', N'Germany');
    GO
    
    SELECT * FROM TestSchema.Employees;
    GO
    
  2. Navigeer in de opdrachtprompt naar SqlServerSample en gebruik sqlcmd om verbinding te maken met de database en voer uw zojuist gemaakte Azure SQL-script uit. Vervang de juiste waarden voor uw server en database.

    az login
    sqlcmd -S <your_server>.database.windows.net -G -d <your_database> -i ./CreateTestData.sql
    

Code invoegen om een query uit te voeren op de database

  1. Maak een bestand met de naam sample.go in de SqlServerSample map.

  2. Plak deze code in het bestand. Voeg de waarden voor uw server en database toe. In dit voorbeeld worden de Golang-contextmethoden gebruikt om ervoor te zorgen dat er een actieve verbinding is.

    package main
    
    import (
        "github.com/microsoft/go-mssqldb/azuread"
        "database/sql"
        "context"
        "log"
        "fmt"
        "errors"
    )
    
    var db *sql.DB
    
    var server = "<your_server.database.windows.net>"
    var port = 1433
    var database = "<your_database>"
    
    func main() {
        // Build connection string
        connString := fmt.Sprintf("server=%s;port=%d;database=%s;fedauth=ActiveDirectoryDefault;", server, port, database)
    
        var err error
    
        // Create connection pool
            db, err = sql.Open(azuread.DriverName, connString)
        if err != nil {
            log.Fatal("Error creating connection pool: ", err.Error())
        }
        ctx := context.Background()
        err = db.PingContext(ctx)
        if err != nil {
            log.Fatal(err.Error())
        }
        fmt.Printf("Connected!\n")
    
        // Create employee
        createID, err := CreateEmployee("Jake", "United States")
        if err != nil {
            log.Fatal("Error creating Employee: ", err.Error())
        }
        fmt.Printf("Inserted ID: %d successfully.\n", createID)
    
        // Read employees
        count, err := ReadEmployees()
        if err != nil {
            log.Fatal("Error reading Employees: ", err.Error())
        }
        fmt.Printf("Read %d row(s) successfully.\n", count)
    
        // Update from database
        updatedRows, err := UpdateEmployee("Jake", "Poland")
        if err != nil {
            log.Fatal("Error updating Employee: ", err.Error())
        }
        fmt.Printf("Updated %d row(s) successfully.\n", updatedRows)
    
        // Delete from database
        deletedRows, err := DeleteEmployee("Jake")
        if err != nil {
            log.Fatal("Error deleting Employee: ", err.Error())
        }
        fmt.Printf("Deleted %d row(s) successfully.\n", deletedRows)
    }
    
    // CreateEmployee inserts an employee record
    func CreateEmployee(name string, location string) (int64, error) {
        ctx := context.Background()
        var err error
    
        if db == nil {
            err = errors.New("CreateEmployee: db is null")
            return -1, err
        }
    
        // Check if database is alive.
        err = db.PingContext(ctx)
        if err != nil {
            return -1, err
        }
    
        tsql := `
          INSERT INTO TestSchema.Employees (Name, Location) VALUES (@Name, @Location);
          select isNull(SCOPE_IDENTITY(), -1);
        `
    
        stmt, err := db.Prepare(tsql)
        if err != nil {
           return -1, err
        }
        defer stmt.Close()
    
        row := stmt.QueryRowContext(
            ctx,
            sql.Named("Name", name),
            sql.Named("Location", location))
        var newID int64
        err = row.Scan(&newID)
        if err != nil {
            return -1, err
        }
    
        return newID, nil
    }
    
    // ReadEmployees reads all employee records
    func ReadEmployees() (int, error) {
        ctx := context.Background()
    
        // Check if database is alive.
        err := db.PingContext(ctx)
        if err != nil {
            return -1, err
        }
    
        tsql := fmt.Sprintf("SELECT Id, Name, Location FROM TestSchema.Employees;")
    
        // Execute query
        rows, err := db.QueryContext(ctx, tsql)
        if err != nil {
            return -1, err
        }
    
        defer rows.Close()
    
        var count int
    
        // Iterate through the result set.
        for rows.Next() {
            var name, location string
            var id int
    
            // Get values from row.
            err := rows.Scan(&id, &name, &location)
            if err != nil {
                return -1, err
            }
    
            fmt.Printf("ID: %d, Name: %s, Location: %s\n", id, name, location)
            count++
        }
    
        return count, nil
    }
    
    // UpdateEmployee updates an employee's information
    func UpdateEmployee(name string, location string) (int64, error) {
        ctx := context.Background()
    
        // Check if database is alive.
        err := db.PingContext(ctx)
        if err != nil {
            return -1, err
        }
    
        tsql := fmt.Sprintf("UPDATE TestSchema.Employees SET Location = @Location WHERE Name = @Name")
    
        // Execute non-query with named parameters
        result, err := db.ExecContext(
            ctx,
            tsql,
            sql.Named("Location", location),
            sql.Named("Name", name))
        if err != nil {
            return -1, err
        }
    
        return result.RowsAffected()
    }
    
    // DeleteEmployee deletes an employee from the database
    func DeleteEmployee(name string) (int64, error) {
        ctx := context.Background()
    
        // Check if database is alive.
        err := db.PingContext(ctx)
        if err != nil {
            return -1, err
        }
    
        tsql := fmt.Sprintf("DELETE FROM TestSchema.Employees WHERE Name = @Name;")
    
        // Execute non-query with named parameters
        result, err := db.ExecContext(ctx, tsql, sql.Named("Name", name))
        if err != nil {
            return -1, err
        }
    
        return result.RowsAffected()
    }
    

Golang-projectafhankelijkheden ophalen en de code uitvoeren

  1. Navigeer in de opdrachtprompt naar SqlServerSample en installeer het SQL Server-stuurprogramma voor Go door de volgende opdrachten uit te voeren.

    go mod init SqlServerSample
    go mod tidy
    
  2. Voer bij de opdrachtprompt de volgende opdracht uit.

    az login
    go run sample.go
    
  3. Controleer de uitvoer.

    Connected!
    Inserted ID: 4 successfully.
    ID: 1, Name: Jared, Location: Australia
    ID: 2, Name: Nikita, Location: India
    ID: 3, Name: Astrid, Location: Germany
    ID: 4, Name: Jake, Location: United States
    Read 4 row(s) successfully.
    Updated 1 row(s) successfully.
    Deleted 1 row(s) successfully.