Inicio rápido: Uso de Golang para consultar una base de datos de Azure SQL Database o Instancia administrada de Azure SQL
SE APLICA A:
Azure SQL Database
Azure SQL Managed Instance
En este inicio rápido, usará el lenguaje de programación Golang para conectarse a una base de datos de Azure SQL Database o Instancia administrada de Azure SQL. Luego, ejecutará instrucciones Transact-SQL para consultar y modificar datos. Golang es un lenguaje de programación de código abierto que facilita la compilación de software eficaz, confiable y simple.
Requisitos previos
Para completar este inicio rápido necesita instalar:
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Una base de datos de Azure SQL Database o Instancia administrada de Azure SQL. Puede utilizar uno de estos inicios rápidos para crear una base de datos:
SQL Database Instancia administrada de SQL SQL Server en máquina virtual de Azure Creación Portal Portal Portal Creación CLI CLI Creación PowerShell PowerShell PowerShell Configuración Regla de firewall de IP en el nivel de servidor Conectividad desde una máquina virtual Configuración Conectividad desde un entorno local Conexión a una instancia de SQL Server Carga de datos Adventure Works cargado por inicio rápido Restauración de World Wide Importers Restauración de World Wide Importers Carga de datos Restauración o importación de Adventure Works desde un archivo BACPAC desde GitHub Restauración o importación de Adventure Works desde un archivo BACPAC desde GitHub Importante
Los scripts de este artículo se escriben para utilizar la base de datos Adventure Works. Con una instancia administrada de SQL, debe importar la base de datos Adventure Works en una base de datos de instancia, o bien modificar los scripts de este artículo para utilizar la base de datos Wide World Importers.
Golang y el software relacionado para el sistema operativo instalado:
Obtención de información de conexión del servidor
Obtenga la información de conexión que necesita para conectarse a la base de datos. En los procedimientos siguientes, necesitará el nombre completo del servidor o nombre de host, el nombre de la base de datos y la información de inicio de sesión.
Inicie sesión en Azure Portal.
Vaya a las páginas Bases de datos SQL o Instancias administradas de SQL.
En la página Información general, revise el nombre completo del servidor junto a Nombre del servidor para una base de datos de Azure SQL Database o el nombre completo (o la dirección IP) del servidor junto a Host para una instancia administrada de Azure SQL o SQL Server en la máquina virtual de Azure. Para copiar el nombre del servidor o nombre de host, mantenga el cursor sobre él y seleccione el icono Copiar.
Nota
Para obtener información de la conexión de SQL Server en una máquina virtual de Azure, consulte Conexión a una instancia de SQL Server.
Creación de un proyecto de Golang y sus dependencias
Desde el terminal, cree una carpeta de proyecto nueva llamada SqlServerSample.
mkdir SqlServerSampleVaya a SqlServerSample e instale el controlador de SQL Server para Go.
cd SqlServerSample go get github.com/denisenkom/go-mssqldb
Creación de datos de ejemplo
En un editor de texto, cree un archivo denominado CreateTestData.sql en la carpeta SqlServerSample. En el archivo, pegue este código T-SQL, que crea un esquema, una tabla e inserta algunas filas.
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; GOUse
sqlcmdpara conectarse a la base de datos y ejecutar el script de Azure SQL recién creado. Reemplace los valores de servidor, base de datos, nombre de usuario y contraseña correspondientes.sqlcmd -S <your_server>.database.windows.net -U <your_username> -P <your_password> -d <your_database> -i ./CreateTestData.sql
Inserción de código para consultar la base de datos
Cree un archivo denominado sample.go en la carpeta SqlServerSample.
En el archivo, pegue este código. Agregue los valores de servidor, base de datos, nombre de usuario y contraseña. En este ejemplo se usan los métodos contextuales de Golang para asegurarse de que hay una conexión activa.
package main import ( _ "github.com/denisenkom/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() }
Ejecución del código
En el símbolo del sistema, ejecute el siguiente comando.
go run sample.goCompruebe el resultado.
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.