التشغيل السريع: استخدم Golang للاستعلام عن قاعدة بيانات في Azure SQL Database أو مثيل Azure SQL Managed

ينطبق على: قاعدة بيانات Azure SQL مثيل Azure SQL المُدار

في هذا التشغيل السريع، ستستخدم لغة البرمجة Golang للاتصال بقاعدة بيانات في Azure SQL Database أو Azure SQL Managed Instance باستخدام [go-mssqldb]((https://github.com/microsoft/go-mssqldb). يستعلم النموذج عن البيانات ويعدلها باستخدام عبارات Transact-SQL صريحة. ⁧⁩Golang⁧⁩ هي لغة برمجة مفتوحة المصدر تجعل من السهل بناء برامج بسيطة وموثوق بها وفعالة.

المتطلبات الأساسية

للتشغيل السريع، تحتاج إلى:

الحصول على معلومات اتصال الخادم

احصل على معلومات الاتصال التي تحتاجها للاتصال بقاعدة البيانات. ستحتاج إلى اسم الخادم المؤهل بالكامل أو اسم المضيف واسم قاعدة البيانات ومعلومات تسجيل الدخول للإجراءات القادمة.

  1. تسجيل الدخول إلى ⁧⁩مدخل Azure⁧⁩.

  2. انتقل إلى قواعد بيانات SQL أو صفحة مثيلات SQL المدارة.

  3. في صفحة ⁧⁩Overview⁧⁩، راجع اسم الخادم المؤهل بالكامل بجوار ⁧⁩Server name⁧⁩ لقاعدة بيانات في Azure SQL Database أو اسم الخادم المؤهل بالكامل (أو عنوان IP) بجوار ⁧⁩Host⁧⁩ لـ Azure SQL Managed Instance أو SQL Server على Azure VM. لنسخ اسم الخادم أو اسم المضيف، مرر فوقه وحدد الأيقونة ⁧⁩Copy⁧⁩.

ملاحظة

للحصول على معلومات الاتصال SQL Server على Azure VM، يُرجى الاطلاع على ⁧⁩Connect to a SQL Server instance⁧⁩.

إنشاء مشروع Golang والتبعيات

  1. من المحطة الطرفية، إنشاء مجلد مشروع جديد يسمى ⁧⁩SqlServerSample⁧⁩.

    mkdir SqlServerSample
    
  2. انتقل إلى ⁧⁩SqlServerSample⁧⁩ وتثبيت برنامج التشغيل SQL Server لـ Go.

    cd SqlServerSample
    go get github.com/microsoft/go-mssqldb
    

إنشاء بيانات العينة

  1. في محرر نص إنشاء ملف يسمى ⁧⁩CreateTestData.sql⁧⁩ في المجلد ⁧⁩SqlServerSample⁧.⁩ في الملف، الصق التعليمات البرمجية T-SQL هذا، والذي ينشئ مخططًا وجدولاً ويدرج صفوفًا قليلة.

    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'Tom',    N'Germany');
    GO
    
    SELECT * FROM TestSchema.Employees;
    GO
    
  2. استخدم ⁧sqlcmd⁩ للاتصال بقاعدة البيانات وتشغيل البرنامج النصي SQL Azure الذي تم إنشاؤه حديثًا. استبدل القيم المناسبة لخادمك وقاعدة البيانات واسم المستخدم وكلمة المرور.

    sqlcmd -S <your_server>.database.windows.net -U <your_username> -P <your_password> -d <your_database> -i ./CreateTestData.sql
    

إدراج التعليمات البرمجية للاستعلام عن قاعدة البيانات

  1. إنشاء ملف باسم ⁧⁩sample.go⁧⁩ في المجلد ⁧⁩SqlServerSample⁧.⁩

  2. في الملف، قم بلصق هذه التعليمات البرمجية. أضف القيم لخادمك وقاعدة بياناتك واسم المستخدم وكلمة المرور. يستخدم هذا المثال Golang⁧⁩أساليب سياق⁧⁩ للتأكد من وجود اتصال نشط.

    package main
    
    import (
        _ "github.com/microsoft/go-mssqldb"
        "database/sql"
        "context"
        "log"
        "fmt"
        "errors"
    )
    
    var db *sql.DB
    
    var server = "<your_server.database.windows.net>"
    var port = 1433
    var user = "<your_username>"
    var password = "<your_password>"
    var database = "<your_database>"
    
    func main() {
        // Build connection string
        connString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;",
            server, user, password, port, database)
    
        var err error
    
        // Create connection pool
        db, err = sql.Open("sqlserver", 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()
    }
    

تشغيل التعليمات البرمجية

  1. في موجه الأوامر، شغّل الأمر التالي.

    go run sample.go
    
  2. التحقق من صحة الناتج.

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

الخطوات التالية