
Los operadores de Python personalizados en SAP Data Intelligence se destacan como una herramienta versátil para desarrollar integraciones personalizadas. La riqueza del ecosistema de bibliotecas de Python abre infinitas oportunidades. Este artículo profundizará en cómo pyodbccomo robusto y versátil ODBC (Conectividad de base de datos abierta) La tecnología permite conexiones perfectas a una amplia gama de bases de datos. La tecnología ODBC es un testimonio de la interoperabilidad, ya que permite un acceso uniforme a los sistemas de bases de datos independientemente de su tipo o proveedor. Al incorporar pyodbc en un operador personalizado, los usuarios pueden aprovechar este amplio soporte de base de datos, lo que garantiza un manejo de datos eficiente y flexible dentro del entorno de SAP Data Intelligence.
Arquitectura del escenario
En este ejemplo, ilustramos cómo conectar operadores de Python en SAP Data Intelligence a una base de datos de Microsoft SQL Server utilizando la biblioteca pyodbc. Este escenario muestra la aplicación práctica de la versatilidad de Python en el entorno SAP, enfocándose en establecer una conexión confiable y eficiente con MS SQL Server para la manipulación y recuperación de datos.
Para probar este escenario, utilizo un versión acoplada de SQL Server desde Dockerhub.
Numerosas bases de datos son compatibles con este enfoque, incluidas, entre otras: Microsoft SQL Server, Oracle Database, MySQL, PostgreSQL, IBM DB2, Teradata, Amazon Redshift, Microsoft Access, SQLite, Informix, MariaDB, SAP HANA, MongoDB, Snowflake, Google. BigQuery, Azure SQL Database, FileMaker Pro, InterSystems Cache y HP Vertica.
Flujo de conexión
El requisito para que una base de datos sea compatible es la disponibilidad de un software de controlador compatible para interactuar con ella.
Para configurar pyodbc para una base de datos en particular, comience instalando los controladores necesarios en un archivo acoplable. Los operadores Python de SAP Data Intelligence normalmente operan en imágenes base SLES (“SUSE Linux Enterprise Server”). Aquí proporcionamos un ejemplo para MS SQL Server, aunque esta configuración se puede adaptar a cualquier controlador de base de datos disponible. Utilizamos una imagen base de OpenSUSE equipada con el administrador de paquetes zypper, teniendo en cuenta que las imágenes base proporcionadas con SAP Data Intelligence no incluyen zypper.
Nota: Tenga cuidado con el etiquetado cuando utilice imágenes base no administradas por SAP.
FROM opensuse/leap:15.3
RUN zypper --non-interactive update
RUN zypper --non-interactive install --no-recommends --force-resolution python39 python39-pip git # Install python3, pip3, git
# install sql server odbc driver
RUN zypper install -y curl
RUN curl -O https://packages.microsoft.com/keys/microsoft.asc
RUN rpm --import microsoft.asc
RUN zypper ar https://packages.microsoft.com/config/sles/15/prod.repo
RUN ACCEPT_EULA=Y zypper install -y msodbcsql17
# add vflow user
RUN groupadd -g 1972 vflow && useradd -g 1972 -u 1972 -m vflow
USER 1972:1972
WORKDIR /home/vflow
ENV HOME=/home/vflow
# install additional python packages as usual
RUN python3.9 -m pip --no-cache-dir install 'pyodbc' --user
En el código demostrado, utilizamos una imagen base ampliamente disponible, lo que le permite depurar esta imagen también en su máquina local. El proceso comienza con la instalación de Python y otros elementos esenciales. Luego, procedemos a instalar el controlador ODBC real usando el administrador de paquetes zypper. Esto incluye agregar el repositorio de Microsoft e importar su clave para garantizar la funcionalidad. Es importante tener en cuenta que los controladores suelen ser software propietario y están sujetos a acuerdos de licencia específicos.
Como estamos usando una imagen personalizada, necesitamos agregar el usuario de vflow, configurar el directorio de trabajo y especificar una variable de entorno. Además, podemos instalar cualquier paquete de Python como estamos acostumbrados en los Dockerfiles. En este caso, por supuesto instalar pyodbc.
Con respecto a la imagen base, debemos etiquetarla con ‘python36’ y ‘tornado’ como requisitos mínimos para su uso en el submotor. Ver el contenido del Etiquetas.json archivo.
Nota: Para obtener más información, puede ver la configuración del $com.sap.sles.base imagen debajo dockerfiles/com/sap/sles/base en el sistema, para comprender cómo se alinea con el entorno de SAP Data Intelligence.
{
"pythonsqlserverodbc": "",
"python36": "",
"tornado": "5.0.2"
}
El siguiente paso es crear un nuevo operador personalizado de Python.
Operador personalizado basado en Python3
Un aspecto clave en esta etapa es asignar la etiqueta que creamos en el Dockerfile a nuestro nuevo operador Python personalizado. Después de asignar la etiqueta, procedemos a completar el script del operador con nuestra implementación de Python.
import pyodbc
sqlserver_connection = api.config.http_connection
api.logger.info(str(sqlserver_connection))
def connect_sqlserver():
# use pyodbc with the driver name of choice
driver_name = "ODBC Driver 17 for SQL Server"
host = sqlserver_connection["connectionProperties"]["host"]
port = sqlserver_connection["connectionProperties"]["port"]
server = f"{host},{port}"
user = sqlserver_connection["connectionProperties"]["user"]
password = sqlserver_connection["connectionProperties"]["password"]
conn = pyodbc.connect(f"DRIVER={driver_name};SERVER={server};UID={user};PWD={password}")
# sample sql query
cur = conn.cursor()
cur.execute("SELECT GETDATE() AS CurrentTimestamp;")
for row in cur:
api.logger.info(str(row))
cur.close()
conn.close()
api.add_generator(connect_sqlserver)
Este es un ejemplo sencillo que demuestra cómo conectarse a la base de datos y ejecutar una consulta SQL de muestra. Para ver ejemplos específicos de diferentes bases de datos, consulte la wiki de pyodbc.
Tras una ejecución exitosa, una marca de tiempo actual será visible en los registros. En este caso, he adaptado un tipo de conexión HTTP, asignado a través de la configuración del operador, para transmitir ciertos detalles de configuración. Si bien no es obligatorio (ya que podría codificar los detalles de la conexión), emplear este método mejora la claridad. Como referencia, aquí está el JSON para configSchema.json del operador personalizado:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://sap.com/vflow/PythonSQLServerODBC.configSchema.json",
"type": "object",
"properties": {
"codelanguage": {
"type": "string"
},
"scriptReference": {
"type": "string"
},
"script": {
"type": "string"
},
"http_connection": {
"title": "HTTP Connection",
"description": "HTTP Connection",
"type": "object",
"properties": {
"configurationType": {
"title": "Configuration Type",
"description": "Configuration Type",
"type": "string",
"enum": [
" ",
"Configuration Manager",
"Manual"
]
},
"connectionID": {
"title": "Connection ID",
"type": "string",
"format": "com.sap.dh.connection.id"
},
"connectionProperties": {
"title": "Connection Properties",
"description": "Connection Properties",
"$ref": "http://sap.com/vflow/com.sap.dh.connections.http.schema.json",
"sap_vflow_constraints": {
"ui_visibility": [
{
"name": "configurationType",
"value": "Manual"
}
]
}
}
}
}
},
"required": [
"http_connection"
]
}
En resumen, mejoramos la configuración introduciendo una nueva propiedad llamada «http_connection», que apunta a una conexión del mismo tipo dentro del Aplicación de gestión de conexiones SAP Data Intelligence. Si bien otros tipos de conexión pueden ser adecuados, considero que la conexión HTTP es una forma conveniente de almacenar varios tipos de credenciales. Si es necesario, incluso puede almacenar datos JSON personalizados en los campos del administrador de conexiones para lograr el resultado deseado. La conexión HTTP es particularmente ventajosa cuando se conecta a través de SAP Cloud Connector, ya que la admite como tipo de puerta de enlace.
Crear conexión HTTP para almacenar credenciales
Finalmente podemos incrustar este operador en un gráfico, completar la propiedad http_connection en el operador con nuestro “SQLSERVER_CONNECTION” creado y ejecutarlo.
Operador ODBC personalizado en gráfico
(datetime.datetime(2024, 1, 13, 14, 30, 15, 790000),)
Al examinar la salida del registro, es evidente que efectivamente hemos obtenido acceso a la base de datos dentro de un operador personalizado de SAP Data Intelligence utilizando ODBC.
¡Esperamos que hayas encontrado este blog agradable! No dude en comunicarse si tiene alguna pregunta.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073