martes, 8 de septiembre de 2026

Python y DB (I). MS SQL Server en Ubuntu

 1. Instalar los drivers necesarios

# 1. Añadir el repositorio de Microsoft

# 1.1 Importar la clave GPG de Microsoft
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

# 1.2 Añadir el repositorio (ajusta según tu versión de Ubuntu)
curl https://packages.microsoft.com/config/ubuntu/24.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
# Si no tienes Ubuntu 24.04, comprueba tu versión con lsb_release -a y ajusta la URL (hay listas para 20.04, 22.04, 24.04, etc.)
# 1.3 Actualizamos sudo apt-get update # 2. Instalar el driver ODBC sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 #Nota: msodbcsql18 es la versión actual recomendada #3. Instalar herramientas ODBC generales (recomendado) sudo apt-get install -y unixodbc unixodbc-dev #4. Instalar pyodbc en Python pip install pyodbc #5. Verificar que el driver se instaló bien odbcinst -q -d # Deberías ver algo como [ODBC Driver 18 for SQL Server].


 2. Ejemplo complejo de utilización con python

Importante de este ejemplo:

1. La contraseña es para todo el gestor de base de datos. Por tanto todas las bases de datos tienen la misma contrasena. 
2. Se requiere el prefijo "dbo" para todas las tablas (parwece ser que es el esquema por defecto
2. Inicialmente ponemos las credenciales para la BD "CADASTRE_2019", pero indicando como prefijo de la tabla otra BD se acceden las tablas de otras BD. En este caso se acceden a "BIB_AY" y "ACCEDE"

import pyodbc

# Datos de conexión
server = '192.168.XX.XX'      # IP del servidor (puede incluir puerto: '192.168.XX.XX,1433')
database = 'CADASTRE_2019'
username = 'myuser'
password = 'mypassword'

# Cadena de conexión
conn_str = (
    f'DRIVER={{ODBC Driver 18 for SQL Server}};'
    f'SERVER={server};'
    f'DATABASE={database};'
    f'UID={username};'
    f'PWD={password};'
    f'TrustServerCertificate=yes;'  # Necesario si no hay certificado SSL válido
    #f'Encrypt=yes;'
)
csvs=[ "LHA4Y-LN6DQ-EQLN4","W5NZC-CLPPY-SBM7E","U2AH8-75JLU-CQPNT","20A78-56PIB-SR05R",
	   "X1HWX-S8Y58-W9NQR", # Decret
	   "X8XZN-LID9N-13HYB", # Decret
	   "Y539O-X7X3S-JF6WE", # Transferencia
]       
sql_select=(
    " SELECT A.IIM_IDX, A.IIM_CVA, " +           #//-- (0,1)Nombre doc, CSV
    "       B.IDX_ALI, B.IDX_CP1, B.IDX_FFD, " + #//-- (2,3,4)Documento 2 , Identificadores 2, Firmado  
    "       10000*YEAR(B.IDX_FCH)+100*MONTH(B.IDX_FCH)+DAY(B.IDX_FCH) as FOLDER, " + #//(5)		
    "       B.IDX_EXT, " +                       #//-- (6) Extension archivo       
    "       C.TDO_DES, C.TDO_DE1, " +            #//-- (7,8)Documento 1, identificadores 1
    "       X.FIR_FCH, " +                       #//-- (9)Fecha de la firma "
    "       D.UOR_NOM, D1.UOR_NOM AS NOM_1, " +  #//-- (10,11)Cargos (firmante y en nombre)
    "       E.USU_NOM, " +                       #//-- (12)Nombre firmante 
    "       X.FIR_SIG " +                        #//-- (13) Id de la firma
    " FROM BIB_AY.dbo.IDX_IMP A " +
    " JOIN BIB_AY.dbo.IDX B ON B.IDX_ID=A.IIM_IDX " +
    " JOIN ACCEDE_ADM.dbo.TDO C ON TDO_ID=B.IDX_TDO " +
    " LEFT JOIN BIB_AY.dbo.FIR X ON X.FIR_IDX=A.IIM_IDX " +
    " LEFT JOIN ACCEDE_ADM.dbo.A_ORG_UOR D ON D.UOR_COD=X.FIR_UOR " +
    " LEFT JOIN ACCEDE_ADM.dbo.A_ORG_UOR D1 ON D1.UOR_COD=X.FIR_UOR_SUS "  +
    " LEFT JOIN ACCEDE_ADM.dbo.A_USU E ON E.USU_IDE=X.FIR_USU "
)    
sql_where = f" WHERE A.IIM_CVA='{csvs[0]}' OR A.IIM_IDX=498592" 
sql_order_by= " ORDER BY A.IIM_CVA, X.FIR_FCH";
sql_ = sql_select + sql_where + sql_order_by

try:
    conn = pyodbc.connect(conn_str)
    cursor = conn.cursor()#

    # Ejecutar consulta
    #cursor.execute("SELECT * FROM dbo.TEBA01")
    cursor.execute(sql_)

    # Obtener resultados
    rows = cursor.fetchall()
    for row in rows:
        print(row)

except pyodbc.Error as e:
    print("Error de conexión:", e)

finally:
    if 'conn' in locals():
        conn.close()



No hay comentarios :

Publicar un comentario