При совместном использовании Python .exe с коллегами, которые используют PyODBC для запросов к базе данных, требуется ли только загрузка драйвера ODBC для SQL Server?

У меня есть скрипт python, который я создал и разработал .exe с помощью Pyinstaller, который использует библиотеку pyodbc python для запроса и выглядит как поддельный код ниже. На моем компе работает отлично. Я попытался поделиться своим .exe с парой коллег, которые, как я дважды проверил, имеют доступ для запросов к нашим базам данных в Excel после предоставления им данных для входа. Однако они не могут получить доступ к нашей базе данных из моего python.exe.

После одного тестирования я знаю, что они не могут получить доступ, потому что .exe, который я создал, выдал ошибку (No suitable driver found. Cannot connect.), как вы можете видеть в коде ниже, потому что он не смог найти ODBC Driver 17 for SQL Server на компьютере коллеги. Я считаю, что Excel использует PowerQuery, поэтому он не зависит от драйвера ODBC, но для python потребуется драйвер. У меня такой вопрос: должна ли работать простая установка ODBC Driver 17 for SQL Server по этой ссылке? https://www.microsoft.com/en-us/download/details.aspx?id=56567

У пользователя нет прав администратора для загрузки драйвера (и я не могу проверить это сам на другом компьютере), и у меня ограничено время и доступ к ИТ-ресурсам; в противном случае я бы сам устранял неполадки с пользователем, поэтому мне не терпится услышать, есть ли у кого-нибудь какой-либо опыт в этом или нашел ли он подобный пост/документацию, которая могла бы быть мне полезна. Опять же, код ниже для справки, но мне не нужна помощь с этим. Мне нужно объяснить ИТ, что мне нужно, чтобы они сделали для пользователей, поэтому мне было интересно, будет ли достаточно Microsoft® ODBC Driver 17 for SQL Server® - Windows.

import pandas as pd
import pyodbc

#Connection and credentials
driver_name = ''
driver_names = [x for x in pyodbc.drivers() if x.endswith(' for SQL Server')]
driver_names

if driver_names:
    driver_name = driver_names[-1]
if driver_name:
    conn_str = f'''DRIVER={driver_name};SERVER='''
else:
    print('(No suitable driver found. Cannot connect.)')

server = '111.111.11.111' 
database = 'database' 
username = 'username' 
password = 'password' 
cnxn = pyodbc.connect(conn_str+server+';DATABASE='+database+';UID='+username+';PWD='+ password)

try:
    account_id_input = input("Select Account ID: ").strip()
    print("Confirming Account ID...")   
    #SQL Query
    df = pd.read_sql_query("""
    Select [Account ID], [Year-Month], [Revenue] from database.dbo.tblaccount
    """,
                            cnxn, params=[account_id_input]
                           )
    print("CONFIRMED")
else: print("Incorrect ID or database connection error")
df.to_csv(f'{account_id_input}_data.csv', index=False)

person David Erickson    schedule 26.03.2020    source источник


Ответы (2)


Короче говоря, да, драйвер ODBC требуется только для дополнительной загрузки для pyodbc.

PyODBC — открытый API-интерфейс Python DB, который принимает любой совместимый ODBC. драйвер из любого источника данных (Oracle, SQL Server, PostgreSQL, SalesForce, Quickbooks и т. д.). Драйверы ODBC служат промежуточным звеном между клиентом (т. . Кроме того, ODBC является признанной технологией среди многих платформ, таких как Excel и языки.

В отличие от других Python DB-API (pymysql, cxOracle, psycopg2), pyodbc, как вы знаете, имеет одно требование: указанный драйвер ODBC в коде должен быть заранее установлен на клиентской машине (а не просто установлена ​​библиотека Python). Кстати, это очень похоже на драйверы JDBC с jaydebeapi Python, и Microsoft действительно поддерживает JDBC драйверы для SQL Server.

Ваши коллеги получают следующую ошибку:

Подходящий драйвер не найден. Не удается подключиться.

потому что этот конкретный драйвер ODBC не установлен на их машинах, но установлен на вашей машине. Попросите их проверить, какие версии им доступны, с помощью команды:

pyodbc.drivers()

В качестве фона Microsoft поддерживает несколько драйверов ODBC (различных версий, обратно совместимых) для компьютеров под управлением Windows, Linux и MacOS. Поскольку MS Excel не имеет собственного уровня базы данных, он обычно соединяется с ODBC или OLEDB, но с библиотекой, такой как DAO или ADO (аналог библиотеки Python, pydobc). Возможно, другие ваши коллеги поддерживают другие версии, такие как:

'ODBC Driver 11 for SQL Server'
'ODBC Driver 13 for SQL Server'
'SQL Server'
'SQL Native Client'
'SQL Server Native Client 11.0'

С учетом сказанного, если вы собираетесь распространять свой код, интегрированный в исполняемый файл, среди других пользователей, не вводите в жесткий код какие-либо учетные данные ODBC, поскольку, как вы продемонстрируете, среды ЦП значительно различаются. Вместо этого рассмотрите следующие три решения:

  1. Имя источника данных: создайте Имя источника данных (DSN) индивидуально настраивается для каждого пользовательского компьютера, который может варьироваться в зависимости от разных драйверов, серверов, имени пользователя, пароля и т. д.

    cnxn = pyodbc.connect(dsn="myDatabase")
    
  2. Файл конфигурации: используйте файлы конфигурации, например yaml или json со всеми учетными данными, перечисленными в защищенной папке, а затем интегрированными в соединение. Много онлайн-уроков по этому поводу.

    YAML

    db:
     driver: 'ODBC Driver Name'
     server: '111.111.11.111' 
     database: 'database' 
     username: 'username' 
     password: 'password' 
    

    питон

    import yaml
    
    with open('file.yaml') as f:
        db_creds = yaml.load(f)
    
    ...
    cnxn = pyodbc.connect(driver=db_creds['driver'], host=db_creds['server'],
                          uid=db_creds['username'], pwd=db_creds['password'], 
                          database=db_creds['database'])
    
  3. Переменные среды: используйте переменные среды, постоянно или временно установленные на компьютере пользователя перед подключением.

    import os
    
    ...
    cnxn = pyodbc.connect(driver = os.environ.get('MSSQL_DRIVER'),
                          host = os.environ.get('MSSQL_SERVER'),
                          uid = os.environ.get('MSSQL_USER'), 
                          pwd = os.environ.get('MSSQL_PWD'), 
                          database = os.environ.get('MSSQL_DB'))
    

Просмотрите в Интернете документацию, учебные пособия, блоги и даже другие сообщения SO о том, как устранять неполадки. Выше приведены простые примеры, которые могут нуждаться в корректировке.

person Parfait    schedule 27.03.2020
comment
Правда мой вопрос был плохо сформулирован. Я должен был сказать драйвер ODBC по сравнению с драйвером ODBC 17. Из вашего ответа я вижу, что есть и другие альтернативы. Это чрезвычайно информативный пост, и я постараюсь реализовать ваши предложения. - person David Erickson; 28.03.2020
comment
Я думал, что отчасти проблема в терминологии. Это началось как комментарий к вам, но расширилось до ответа. Я обновил соответственно. Так что да, драйвер ODBC будет только другим требованием pyodbc. Коллеги должны иметь возможность подключаться со своими версиями драйверов. - person Parfait; 28.03.2020
comment
Поскольку вы обновили свой ответ, я также обновил свой вопрос, чтобы все выровнялось. - person David Erickson; 28.03.2020

Короче говоря, ответ на этот вопрос оказался «Да», но я не удаляю, так как это может быть выгодно и полезно для людей, которые исследуют, как поделиться файлами .exe python/SQL с другими. пользователей аналогично тому, как вы могли бы поделиться макросом Excel.

Предполагая, что пользователь находится в сети нашей компании, единственными требованиями было то, что пользователь:

1) загружает мой файл python .exe, в котором используются библиотеки: а) pyodbc и б) панды

2) загружает ODBC Driver for SQL Server, в зависимости от настройки SQL Server вашей компании. В моем случае пользователь загрузил ODBC Driver 17 for SQL Server: https://www.microsoft.com/en-us/download/details.aspx?id=56567

Это означает, что им не нужно полностью устанавливать SQL Server, только драйвер!

person David Erickson    schedule 27.03.2020