Junio de 2017

Volumen 32, número 6

Puntos de datos - Visual Studio Code: crear un IDE de base de datos con la extensión mssql

Por Julie Lerman | Junio de 2017

Julie LermanAunque Visual Studio sigue siendo mi IDE de referencia para el desarrollo de .NET intenso, me encanta Visual Studio Code (VS Code), tanto para trabajar en C#, JavaScript o Node, ya sea con Windows o macOS. Naturalmente, existen muchos otros lenguajes y marcos compatibles con VS Code y sus infinitas extensiones, pero estos son mis conjuntos de herramientas actuales. No soy el único a quien le encanta VS Code. Durante el lanzamiento de Visual Studio 2017 en marzo de 2017, Microsoft anunció que VS Code tenía 1,3 millones de usuarios mensuales activos. Lo que es realmente genial es que, igual que en cualquier herramienta multiplataforma, cada miembro del equipo puede seleccionar su sistema operativo favorito, pero usar las mismas herramientas de codificación.

Por otro lado, están los datos. Siempre hay datos implicados. Pasé muchos años trabajando solo con SQL Server y codificando aplicaciones de Windows. Durante estos últimos años, amplié mis horizontes, no solo con un nuevo IDE (VS Code), sino también con nuevas bases de datos y plataformas (escribo esto en mi MacBook Pro).

Mi incursión en VS Code se inició como parte de mis andanzas con Node.js, de las que fue testigo en esta misma columna. Esto ocurría originalmente en Windows. No obstante, dado que VS Code es un editor multiplataforma (compilado con Electron), a veces iba hacia atrás y hacia adelante, trabajando en el mismo código, a veces en Windows y a veces en macOS, con GitHub como denominador común. Gracias a la extensión de C# y a la naturaleza multiplataforma de .NET Core, a veces iba más allá de Node.js para escribir aplicaciones de .NET Core con EF Core en ambos entornos. En Visual Studio, dependo en gran medida de la herramienta SQL Server Data Tools integrada y la extensión CE/SQLite Toolbox de SQL para explorar la mayoría de los datos que crean mis aplicaciones. No obstante, con VS Code, necesito alguna herramienta externa para explorar los datos. El uso de Windows y el editor superligero VS Code nunca me pareció la mejor opción para abrir SQL Server Management Studio, que es cualquier cosa menos ligero. Para otras bases de datos, ya sea en Windows o Mac, también usaba JetBrains DataGrip (jetbrains.com/datagrip), una herramienta de base de datos multiplataforma que admite una gran cantidad de bases de datos.

No obstante, debido al crecimiento del universo de extensiones de VS Code (cuya cantidad se aproxima a 3000 mientras escribo este artículo a finales de abril de 2017), varias extensiones para interactuar con los almacenes de datos se han puesto sobre la mesa. Existen dos con las que ya he trabajado: la extensión mssql (bit.ly/2gb2ICf) del equipo de SQL Server y la extensión vscode-database de SQLite y PostgreSQL (bit.ly/2mh8nYF). Estas extensiones le permiten escribir y ejecutar SQL en sus bases de datos. Puede ver las demos de ambas en mi curso de Pluralsight, "Entity Framework Core: Getting Started" (Entity Framework Core: Introducción). También existen otras extensiones relacionadas con los datos, por ejemplo, para interactuar con datos de Azure Data Lake (también de Microsoft), Redis y SalesForce. Algunas de estas se encuentran aún en versión preliminar, incluida la extensión mssql.

En este artículo, le mostraré algunos de los conceptos básicos de la extensión mssql. Inicialmente, tenía previsto escribir sobre mssql y vscode-database, pero la extensión mssql ofrece tantas características, que me entretuve enormemente explorándola y le dediqué toda la asignación de palabras de esta columna. Trabaje en Windows, macOS o Linux, no hay ninguna diferencia en el uso de mssql.

La extensión mssql permite interactuar con distintas bases de datos SQL Server: Microsoft SQL Server, Azure SQL Database y SQL Data Warehouse. Dado que me encuentro ante un MacBook, me conectaré a un servidor SQL Server externo. Se habrá dado cuenta de que ahora SQL Server se ejecuta en Linux, ¿no es increíble? Esto significa que puede sincronizar un contenedor de Docker que ejecute SQL Server. No lo haré en este artículo, pero escribí una publicación en el blog sobre el tema, que puede leer en bit.ly/2qaev9r. Lo que sí haré es conectarme a una base de datos de Azure SQL Server en la nube. Esto servirá para recordarle que no necesita ser desarrollador o administrador de Windows ni desarrollador de C# para usar SQL Server. Puede administrarlo en Azure Portal y conectarse a él desde cualquier tipo de aplicación. Por tanto, imagine que su aplicación es PHP, usa la extensión PHP de VS Code y se comunica con una base de datos SQL Server en Azure. 

Aproveché la cuenta de Azure gratuita y los créditos que se incluían con una suscripción a Visual Studio para crear una base de datos de Azure SQL Database basada en el ejemplo de AdventureWorks. La documentación para hacerlo se encuentra en bit.ly/2o2IDTy.

De vuelta a VS Code, para instalar la extensión mssql, haga clic en el icono de la extensión en la barra de actividades de VS Code, filtre por mssql y, a continuación, haga clic en el botón Instalar. Se le pedirá que vuelva a cargar VS Code cuando esté preparado, pero tenga en cuenta que ello retrasará la parte de instalación de la extensión hasta que use uno de sus comandos. En el caso de macOS, deberá instalar OpenSSL. Consulte el vínculo de la documentación de mssql (indicado anteriormente) para obtener más información.

Además del motor de ejecución de consultas instalado, mssql coloca una gran cantidad de comandos en la paleta de comandos de VS Code. Tiene sentido empezar con la conexión a su base de datos, aunque otras funciones le pedirán que se conecte si aún no lo hizo.

Abra la paleta con F1 (o Ctrl o Comando+Mayús+P si tiene uno de esos divertidos teclados sin teclas de función) y escriba MS SQL para filtrar por todos los comandos de mssql. Si no tiene ninguna otra extensión que proporcione comandos con la palabra clave SQL, solo SQL resolverá el problema. Me encanta que se pueda acceder a los archivos de ayuda con el comando Guía de introducción. También puede almacenar distintas conexiones y, después, conectarse fácilmente a la característica Manage Connection Profiles (Administrar perfiles de conexión).

La manera más fácil de interactuar con mssql es tener un archivo abierto para editar y asegurarse de que VS Code sepa que está editando SQL. Esto se puede hacer con una carpeta o un proyecto abierto gracias al comando Nueva consulta. Ello creará un archivo SQLQuery.sql y la extensión sql hará que VS Code cambie al editor de mssql. El editor actual se indica en la esquina inferior derecha de VS Code, y cambia en función de las extensiones de archivo para ofrecer las características de IntelliSense adecuadas, entre otras, que proporciona la extensión. Puede hacer clic en el contenido que se muestra para cambiarlo si es necesario. El editor de mssql no solo le proporcionará ayuda para la escritura de TSQL, sino que también sabe cómo ejecutar consultas y realizar otras tareas que define la extensión.

Con un archivo SQL abierto en el editor, al seleccionar MS SQL: La opción Conectar de la paleta de comandos mostrará una lista de los perfiles de conexión existentes que ya creó y le permitirá crear uno nuevo. Seleccione Create Connection Profile (Crear perfil de conexión) y, a continuación, se le pedirá cada elemento clave de la cadena de conexión. Por ejemplo, el primer mensaje solicita el nombre del servidor, como se muestra en la Figura 1. Mi base de datos de SQL Azure se encuentra en un servidor denominado thedatafarmsqlerver.database.windows.net, que es lo que escribiré.

Conexión de una base de datos SQL con la extensión MSSQL
Figura 1 Conexión de una base de datos SQL con la extensión MSSQL

A continuación, se le pedirá que escriba el nombre de la base de datos, su id. de inicio de sesión y contraseña y, luego, un nombre de perfil opcional. Por cierto, Manage Connection Profiles (Administrar perfiles de conexión) también puede conducirle a este punto, ya que incluye una opción de menú Create (Crear).

Después de rellenar la información de conexión y de conectarse correctamente, el perfil se guardará en el archivo de configuración de VS Code. Con la versión 0.3, si la conexión no se establece correctamente, el perfil no se almacenará. Pero esa experiencia va a cambiar. Para observar el perfil almacenado, puede ir a Preferencias y Configuración desde el menú de VS Code, o bien usar la combinación de teclas Ctrl o Comando+, (coma). A continuación se muestra un ejemplo de un perfil de conexión:

"mssql.connections": [
  {
    "authenticationType": "SqlLogin",
    "server": "thedatafarmsqlserver.database.windows.net",
    "database": "AdventureWorksSample",
    "user": "me",
    "password": "mypassword",
    "savePassword": true,
    "profileName": "AzureAWSample"}
  }
]

Con los perfiles almacenados en la configuración, tiene la opción de seleccionar AzureAWSample u otros perfiles almacenados cuando quiera conectarse.

Una vez conectado, puede comenzar a escribir y a ejecutar TSQL. La manera más fácil de hacerlo es tener el archivo con la extensión SQL abierto en el editor. Como ya mencioné, esto hará que se activen las características del editor de SQL. Una de estas fantásticas características son los fragmentos de código de TSQL integrados.

Empiece escribiendo sql en la ventana del editor e IntelliSense mostrará la lista de fragmentos de código integrados, tal como se muestra en la Figura 2.

Fragmentos de código TSQL proporcionados por la extensión mssql
Figura 2 Fragmentos de código TSQL proporcionados por la extensión mssql

Puede observar que no se limita a consultar simplemente los datos existentes: mssql ejecutará cualquier TSQL (válido y permisible). Me gusta enumerar las bases de datos o las tablas y las vistas de una base de datos seleccionada para comprobar que estoy conectado a la base de datos correcta, y el fragmento de código ListTablesAndViews es excelente para este fin. Normalmente, tendría que pedir al dr. GoogleBing que me ayudara con este TSQL, por lo que estoy sumamente agradecido con este fragmento de código.

Al presionar Ctrl o Comando+Mayús+E se ejecutará el comando. También puede seleccionar el texto y hacer clic con el botón derecho para abrir el menú contextual, que incluye la opción Ejecutar.

Se abre un panel de resultados con una respuesta como la de la Figura 3.

Resultados de una consulta de esquema
Figura 3 Resultados de una consulta de esquema

En la esquina superior derecha, observe que hay dos pequeños iconos. El primero permite guardar los resultados como un archivo de texto CSV. El segundo está destinado a guardar los resultados en formato JSON. Vamos a realizar una consulta que obtenga datos del cliente, a ver qué aspecto tienen los resultados y, luego, a guardarlos en formato JSON. Con la lista de tablas ante mí, puedo empezar a escribir mi consulta y, como muestra la Figura 4, IntelliSense contribuye con el conocimiento del esquema de base de datos.

IntelliSense lee el esquema y ayuda con la compilación de TSQL
Figura 4 IntelliSense lee el esquema y ayuda con la compilación de TSQL

Modifiqué mi instrucción select para obtener tres columnas de Sales­LT.Customer. Posteriormente, pude resaltar la instrucción y usar el método abreviado de teclado Ctrl o Comando+Mayús+E de nuevo para ejecutar justo esa consulta. Igual que con SQL Server Management Studio, puedo ejecutar una o varias instrucciones y, en respuesta, ver uno o varios conjuntos de resultados.

Los resultados se presentan en una cuadrícula como se muestra en la Figura 5. Puede resaltar una o varias combinaciones de filas y columnas y, a continuación, hacer clic en los iconos de CSV o JSON, que le pedirán un nombre de archivo para guardar la selección. Puede seleccionar fácilmente todos los datos desde un menú contextual si hace clic con el botón derecho en la cuadrícula.

Resultado de una consulta de datos del cliente
Figura 5 Resultado de una consulta de datos del cliente

El símbolo del sistema de nombre de archivo muestra la ruta de acceso de la carpeta actual. Si esta es la ubicación donde quiere guardar el archivo, no tiene que volver a escribir la ruta de acceso. Solo tiene que escribir el nombre del archivo, que se guardará en esa carpeta. No me di cuenta de ello las primeras veces, así que aprenda de mi error.

Solo seleccioné la primera fila de los datos del cliente que mi consulta proyectaba y, después, usé el icono Guardar en JSON y especifiqué un nombre de archivo. Este es el JSON que se generó en mi archivo:

[
  {
    "CustomerID": "1",
    "FirstName": "Orlando",
    "LastName": "Gee"
  }
]

Tenga en cuenta que puede agregar fácilmente sus propios fragmentos de código en VS Code. Vamos a crear uno para enumerar las funciones y los procedimientos almacenados. Para empezar, diríjase a Preferencias y User Snippets (Fragmentos de código del usuario). Observará que la extensión mssql agregó una plantilla para los fragmentos de código SQL. Elíjala y se abrirá la plantilla en blanco. A medida que agregue más fragmentos de código, seguirá trabajando en este archivo. Asimismo, si creó algunos fragmentos de código para compartir (o quizás para buscar un error o hacerse otra idea de mssql), esta es una extensión de código abierto, en la que puede contribuir a través de github.com/Microsoft/vscode-mssql para enviar solicitudes de incorporación de cambios o problemas.

Después de una larga sesión con el dr. GoogleBing y de probar distintas ideas, aquí tiene el fragmento de código que creé para enumerar todos los procedimientos y las funciones almacenados en la base de datos de destino:

"List Stored Procedures": {
  "prefix": "sqlListStoredProcedures",
  "body": [
    "SELECT [Name],[Type_Desc] " ,
    "FROM [sys].[all_objects] " ,
    "WHERE ([Type] = 'P' OR [Type]='FN' OR [Type]='TF' OR [Type]='IF') ",
    "AND [Is_MS_Shipped] = 0"
  ],
  "description": "List Stored Procedures"
}

Ahora, cuando escribo sql en la ventana del editor, sqlListStoreProcedures se encuentra entre las opciones. Los resultados de ejecutar ese comando en mi base de datos de destino son los siguientes:

Name                         Type_Desc
uspPrintError                SQL_STORED_PROCEDURE
uspLogError                  SQL_STORED_PROCEDURE
ufnGetAllCategories          SQL_TABLE_VALUED_FUNCTION
ufnGetSalesOrderStatusText   SQL_SCALAR_FUNCTION
ufnGetCustomerInformation    SQL_INLINE_TABLE_VALUED_FUNCTION

Pude compartir esta salida, para lo cual hice clic en la cuadrícula de resultados y seleccioné la opción "Copiar con encabezados".

Como indican los anuncios de televisión nocturnos: "Espere. Aún hay más". La ventana del editor presenta un menú contextual (consulte la Figura 6).

Menú contextual de la ventana del editor
Figura 6 Menú contextual de la ventana del editor

Los elementos más interesantes que incluye (en mi humilde opción) son Ir a definición y Ver la definición. Si selecciona un nombre de tabla en la ventana de edición (por ejemplo, Customer en el comando que se muestra en la Figura 5), estos comandos le mostrarán el script CREATE de la tabla de clientes.

La extensión mssql evoluciona constantemente y estoy deseando las próximas actualizaciones. La versión 0.3.0 que compartí aquí es una versión preliminar. Si la tiene instalada en Visual Studio Code, recibirá notificaciones de las actualizaciones. Puede ver su evolución y participar en ella en el sitio de GitHub correspondiente en aka.ms/mssql-marketplace.


Julie Lerman es directora regional de Microsoft, MVP de Microsoft, mentora y consultora del equipo de software. Vive en las colinas de Vermont. Puede encontrarla haciendo presentaciones sobre el acceso a datos y otros temas en grupos de usuarios y en conferencias en todo el mundo. Su blog es thedatafarm.com/blog y es la autora de "Programming Entity Framework", así como de una edición de Code First y una edición de DbContext, de O’Reilly Media. Sígala en Twitter en @julielerman y vea sus cursos de Pluralsight en juliel.me/PS-Videos.

Gracias a los siguientes expertos técnicos de Microsoft por revisar este artículo: Kevin Cunnane, Eric Kang y Sanjay Nagamangalam