Detectar automáticamente el controlador ODBC utilizando Pyodbc en Python 3

Hola. Actualmente estoy usando pyodbc en Python 3 y estoy tratando de encontrar una manera de detectar automáticamente el controlador ODBC al no tener que cambiar manualmente cuando lo usan diferentes computadoras. La razón es porque mi computadora tiene el controlador ODBC 13 y la computadora de otro amigo tiene el controlador ODBC 11, por lo que cada vez que ejecutamos el script desde nuestro lado, primero debemos cambiar la versión manualmente para ejecutar el proceso.

¿Alguien puede ayudar a resolver este problema? A continuación se muestra mi código de ejemplo.

Gracias

import os import csv import pyodbc import datetime from dateutil.relativedelta import relativedelta conn = pyodbc.connect( r'DRIVER={ODBC Driver 13 for SQL Server};' r'SERVER=****;' r'DATABASE=****;' r'Trusted_Connection=yes;' ) cursor = conn.cursor() cursor.execute("Select * From Table1") dData = cursor.fetchall() 

Podría usar el método pyodbc.drivers() para recuperar la lista de controladores disponibles y luego seleccionar el que necesita, por ejemplo,

 driver_name = '' driver_names = [x for x in pyodbc.drivers() if x.endswith(' for SQL Server')] if driver_names: driver_name = driver_names[0] if driver_name: conn_str = 'DRIVER={}; ...'.format(driver_name) # then continue with ... # pyodbc.connect(conn_str) # ... etc. else: print('(No suitable driver found. Cannot connect.)') 

Podría usar un bloque try / except , atrapando solo pyodbc.Error :

 import os import csv import pyodbc import datetime from dateutil.relativedelta import relativedelta try: conn = pyodbc.connect( r'DRIVER={ODBC Driver 13 for SQL Server};' r'SERVER=blah;' r'DATABASE=blah;' r'Trusted_Connection=yes;' ) except pyodbc.Error: conn = pyodbc.connect( r'DRIVER={ODBC Driver 11 for SQL Server};' r'SERVER=blah;' r'DATABASE=blah;' r'Trusted_Connection=yes;' ) cursor = conn.cursor() cursor.execute("Select * From Table1") dData = cursor.fetchall() 

¡Buena suerte!

Como sugiere @Adonis, considere crear un archivo de configuración específico para cada usuario y luego leerlo para conectarse a la base de datos. Esto también proporciona más seguridad ya que el código no expone inmediatamente las credenciales:

Cree un archivo .ini de configuración (que se ejecutará una vez específico para cada usuario; ajuste la ruta de escritura a la carpeta necesaria)

 import configparser config = configparser.ConfigParser() config['SQL_SERVER'] = {'DRIVER': 'ODBC Driver 13 for SQL Server', 'SERVER': '****', 'DATABASE': '****', 'Trusted_Connection': 'yes', } with open('db_connect.ini', 'w') as configfile: config.write(configfile) 

Conexión de base de datos (conexión regular, ajuste la ruta de lectura a la carpeta necesaria)

 import configparser import pyodbc config = configparser.ConfigParser() config.read('db_connect.ini') constr = 'DRIVER={{{drv}}};SERVER={srv};DATABASE={db};Trusted_Connection={tc};'\ .format(drv=config['SQL_SERVER']['DRIVER'], srv=config['SQL_SERVER']['SERVER'], db=config['SQL_SERVER']['DATABASE'], tc=config['SQL_SERVER']['Trusted_Connection']) conn = pyodbc.connect(constr)