Mulai cepat: Menggunakan Golang untuk mengkueri database di Azure SQL Database atau Azure SQL Managed Instance

Berlaku untuk:Azure SQL DatabaseAzure SQL Managed Instance

Dalam mulai cepat ini, Anda akan menggunakan bahasa pemrograman Golang untuk menyambungkan ke database Azure SQL, atau database di Azure SQL Managed Instance, dengan driver go-mssqldb . Sampel mengkueri dan memodifikasi data dengan pernyataan Transact-SQL (T-SQL) eksplisit. Golang adalah bahasa pemrogram sumber terbuka yang memudahkan Anda untuk membangun perangkat lunak yang sederhana, andal, dan efisien.

Prasyarat

Untuk menyelesaikan mulai cepat ini, Anda memerlukan:

Dapatkan informasi koneksi server

Dapatkan informasi koneksi yang Anda perlukan untuk menyambungkan ke database. Anda akan memerlukan nama server atau nama host, nama database, dan informasi login yang sepenuhnya memenuhi syarat untuk prosedur yang akan datang.

  1. Masuk ke portal Azure.

  2. Buka halaman SQL Database atau SQL Managed Instances.

  3. Pada halaman Ringkasan, tinjau nama server yang sepenuhnya memenuhi syarat di samping Nama server untuk database di Azure SQL Database atau nama server (atau alamat IP) yang sepenuhnya memenuhi syarat di samping Host untuk Azure SQL Managed Instance atau SQL Server di VM Azure. Untuk menyalin nama server atau nama host, arahkan mouse ke atasnya dan pilih ikon Salin.

Catatan

Untuk informasi koneksi untuk SQL Server di Azure VM, lihat Menyambungkan ke instans SQL Server.

Membuat folder baru untuk proyek dan dependensi Golang

  1. Dari terminal, buat folder proyek baru yang disebut SqlServerSample.

    mkdir SqlServerSample
    

Membuat data sampel

  1. Di editor teks, buat file yang disebut CreateTestData.sql di SqlServerSample folder . Dalam file, tempelkan kode T-SQL ini, yang membuat skema, tabel, dan menyisipkan beberapa baris.

    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. Pada prompt perintah, navigasi ke SqlServerSample dan gunakan sqlcmd untuk menyambungkan ke database dan jalankan skrip Azure SQL yang baru dibuat. Ganti nilai yang sesuai untuk server dan database Anda.

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

Menyisipkan kode untuk mengkueri database

  1. Buat file bernama sample.go di SqlServerSample folder .

  2. Dalam file, tempelkan kode ini. Tambahkan nilai untuk server dan database Anda. Contoh ini menggunakan metode konteks Golang untuk memastikan ada koneksi aktif.

    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()
    }
    

Dapatkan dependensi proyek Golang dan jalankan kode

  1. Pada prompt perintah, navigasikan ke SqlServerSample dan instal driver SQL Server untuk Go dengan menjalankan perintah berikut.

    go mod init SqlServerSample
    go mod tidy
    
  2. Pada prompt perintah, jalankan perintah berikut ini.

    az login
    go run sample.go
    
  3. Verifikasi output.

    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.