التشغيل السريع: استخدم 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 هي لغة برمجة مفتوحة المصدر تجعل من السهل بناء برامج بسيطة وموثوق بها وفعالة.
المتطلبات الأساسية
للتشغيل السريع، تحتاج إلى:
حساب Azure باشتراك نشط. أنشئ حسابًا مجانيًا.
قاعدة بيانات في قاعدة بيانات Azure SQL أو مثيلAzure SQL Managed. يمكنك استخدام أحد التشغيل السريع لإنشاء قاعدة بيانات:
قاعدة بيانات SQL مثيل SQL المدار SQL Server على Azure VM إنشاء المدخل المدخل المدخل إنشاء CLI CLI إنشاء PowerShell PowerShell PowerShell تكوين قاعدة جدار حماية IP على مستوى الخادم الاتصال من VM تكوين الاتصال من أماكن محلية الاتصال بمثيل SQL Server تحميل البيانات تم تحميل Adventure Works لكل تشغيل سريع استعادة Wide World Importers استعادة Wide World Importers تحميل البيانات استعادة أو استيراد Adventure Works من ملف BACPAC من GitHub استعادة أو استيراد Adventure Works من ملف BACPAC من GitHub هام
تتم كتابة البرامج النصية في هذه المقالة لاستخدام قاعدة بيانات Adventure Works. مع مثيل SQL Managed، يجب عليك استيراد قاعدة بيانات Adventure Works إلى قاعدة بيانات مثيل أو تعديل البرامج النصية في هذه المقالة لاستخدام قاعدة بيانات «Wide World Importers».
تم تثبيت Golang والبرامج ذات الصلة لنظام تشغيلك:
- macOS: قم بتثبيت Homebrew وGolang. يُرجى الاطلاع على Step 1.2.
- Ubuntu: قم بتثبيت Golang. يُرجى الاطلاع على Step 1.2.
- تثبيت Windowsقم بتثبيت Golang. يُرجى الاطلاع على Step 1.2.
الحصول على معلومات اتصال الخادم
احصل على معلومات الاتصال التي تحتاجها للاتصال بقاعدة البيانات. ستحتاج إلى اسم الخادم المؤهل بالكامل أو اسم المضيف واسم قاعدة البيانات ومعلومات تسجيل الدخول للإجراءات القادمة.
تسجيل الدخول إلى مدخل Azure.
انتقل إلى قواعد بيانات SQL أو صفحة مثيلات SQL المدارة.
في صفحة 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 والتبعيات
من المحطة الطرفية، إنشاء مجلد مشروع جديد يسمى SqlServerSample.
mkdir SqlServerSample
انتقل إلى SqlServerSample وتثبيت برنامج التشغيل SQL Server لـ Go.
cd SqlServerSample go get github.com/microsoft/go-mssqldb
إنشاء بيانات العينة
في محرر نص إنشاء ملف يسمى 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
استخدم
sqlcmd
للاتصال بقاعدة البيانات وتشغيل البرنامج النصي SQL Azure الذي تم إنشاؤه حديثًا. استبدل القيم المناسبة لخادمك وقاعدة البيانات واسم المستخدم وكلمة المرور.sqlcmd -S <your_server>.database.windows.net -U <your_username> -P <your_password> -d <your_database> -i ./CreateTestData.sql
إدراج التعليمات البرمجية للاستعلام عن قاعدة البيانات
إنشاء ملف باسم sample.go في المجلد SqlServerSample.
في الملف، قم بلصق هذه التعليمات البرمجية. أضف القيم لخادمك وقاعدة بياناتك واسم المستخدم وكلمة المرور. يستخدم هذا المثال 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() }
تشغيل التعليمات البرمجية
في موجه الأوامر، شغّل الأمر التالي.
go run sample.go
التحقق من صحة الناتج.
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.