При совместном использовании Python .exe с коллегами, использующими PyODB C для запроса базы данных, требуется ли загрузка только для ODB C драйвера для SQL Сервера? - PullRequest
1 голос
/ 27 марта 2020

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

. После одного тестирования я знаю, что они не могут получить к нему доступ, потому что .exe-файл, который я создал, вывел ошибку (No suitable driver found. Cannot connect.) как Вы можете увидеть код ниже, потому что он не может найти ODBC Driver 17 for SQL Server на компьютере коллеги. Я считаю, что Excel использует PowerQuery, поэтому он не зависит от драйвера ODB C, но для 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)

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Короче говоря, да ODB C драйвер будет только дополнительная загрузка, необходимая для pyodb c.

PyODB C является открытым закончилась Python DB-API, который принимает любой совместимый драйвер ODB C от любого источника данных (Oracle, SQL Сервер, PostgreSQL, SalesForce, Quickbooks, и др c.). Драйверы ODB C служат средним уровнем между клиентом (то есть Python) и сервером базы данных и, как и любое программное обеспечение, они могут разрабатываться проприетарными поставщиками (например, Oracle, Microsoft), разработчиками с открытым исходным кодом. / группы или третьи лица. Кроме того, ODB C является признанной технологией среди многих платформ, таких как Excel и языки.

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

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

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

, поскольку указанный драйвер c ODB C не установлен на их компьютерах, но установлен на вашем компьютере. Попросите их проверить, какие версии доступны для них, с помощью команды:

pyodbc.drivers()

В качестве фона Microsoft поддерживает несколько ODB C драйверов (различных версий, которые обратно совместимы) для Windows, Linux и машины MacOS. Поскольку MS Excel не имеет собственного уровня базы данных, он обычно соединяется с ODB C или 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'

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

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

    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' 
    

    Python

    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 о способах устранения неполадок. Выше приведены простые примеры, которые могут нуждаться в корректировке.

0 голосов
/ 27 марта 2020

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

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

1) загрузил мой * 1018 Файл * .exe, который использует библиотеки: a) pyodb c и b) pandas

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

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

...