【问题标题】:Automatically Detect ODBC Driver using Pyodbc in Python 3在 Python 3 中使用 Pyodbc 自动检测 ODBC 驱动程序
【发布时间】:2018-04-09 07:18:19
【问题描述】:

您好,我目前在 Python 3 中使用 pyodbc,我正在尝试找出一种方法来自动检测 ODBC 驱动程序,而不必在不同计算机使用时手动更改。原因是我的电脑有 ODBC Driver 13,而另一个朋友的电脑有 ODBC Driver 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()

【问题讨论】:

  • 为什么不将连接字符串放在 config.ini 中?然后,每个人都可以根据您的环境拥有自己的配置文件
  • @Adonis 感谢您的反馈,您能给我举个例子吗?这是我第一次使用它,所以有例子会很棒!
  • 我认为configparser 上的文档解释得很好:docs.python.org/3/library/configparser.html 如果您需要更多信息,请告诉我

标签: python sql-server python-3.x odbc pyodbc


【解决方案1】:

您可以使用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.)')

【讨论】:

    【解决方案2】:

    正如@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)
    

    【讨论】:

      【解决方案3】:

      您可以使用 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()
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多