在Python 3中使用Pyodbc自动检测ODBC驱动程序

suzh9iv8  于 4个月前  发布在  Python
关注(0)|答案(3)|浏览(91)

你好,我目前正在使用python3中的pyodbc,我试图找出一种方法来自动检测ODBC驱动程序,而不必在不同的计算机上使用时手动更改。原因是因为我的计算机上有ODBC驱动程序13,另一个朋友的计算机上有ODBC驱动程序11,所以每当我们从我们这边运行脚本时,我们必须首先手动更改版本才能执行该过程。
有谁能帮我解决这个问题吗?下面是我的示例代码。
谢谢你

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()

字符串

r1wp621o

r1wp621o1#

您可以使用pyodbc.drivers()方法检索可用驱动程序的列表,然后选择您需要的驱动程序,例如,

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.)')

字符串

falq053o

falq053o2#

正如@Adonis建议的那样,考虑构建一个特定于每个用户的配置文件,然后读取它以连接到数据库。这也提供了更多的安全性,因为代码不会立即暴露凭据:

构建配置.ini文件 (针对每个用户运行一次;调整写入路径到所需文件夹)

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)

字符串

**数据库连接 (常规连接,调整读取路径到需要的文件夹)

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)

nwlls2ji

nwlls2ji3#

您可以使用try/except块,仅捕获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()

字符串
祝你好运!

相关问题