Saat berbagi Python .exe dengan rekan kerja yang menggunakan PyODBC untuk menanyakan database, apakah Driver ODBC untuk SQL Server satu-satunya unduhan yang diperlukan?

Saya memiliki skrip python yang saya buat dan kembangkan .exe dengan Pyinstaller yang menggunakan perpustakaan pyodbc python untuk menanyakan dan terlihat seperti kode palsu di bawah ini. Ini berfungsi di komputer saya dengan sempurna. Saya mencoba membagikan .exe saya dengan beberapa rekan kerja, yang telah saya periksa ulang memiliki akses untuk menanyakan database kami di Excel setelah memberikan mereka informasi login. Namun, mereka tidak dapat mengakses database kami dari dalam python .exe saya.

Setelah pengujian sekali, saya tahu bahwa mereka tidak dapat mengakses, karena .exe yang saya buat menghasilkan kesalahan (No suitable driver found. Cannot connect.) seperti yang Anda lihat pada kode di bawah ini, karena tidak dapat menemukan ODBC Driver 17 for SQL Server di komputer rekan. Saya yakin Excel menggunakan PowerQuery, jadi tidak bergantung pada Driver ODBC, tetapi python akan memerlukan driver tersebut. Pertanyaan saya adalah -- apakah menginstal ODBC Driver 17 for SQL Server dari tautan ini saja sudah berfungsi? https://www.microsoft.com/en-us/download/details.aspx?id=56567

Pengguna tidak memiliki hak admin untuk mengunduh driver (dan saya tidak dapat mengujinya sendiri di komputer lain) dan saya memiliki waktu dan akses terbatas ke sumber daya TI; jika tidak, saya akan memecahkan masalah pengguna sendiri, jadi saya ingin tahu apakah ada yang punya pengalaman dengan ini atau menemukan postingan/dokumentasi serupa yang dapat membantu saya. Sekali lagi, kode di bawah ini untuk referensi, tetapi saya tidak memerlukan bantuan untuk itu. Saya perlu menjelaskan kepada TI apa yang saya ingin mereka lakukan untuk pengguna, itulah sebabnya saya bertanya-tanya apakah Microsoft® ODBC Driver 17 for SQL Server® - Windows sudah cukup.

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 sumber


Jawaban (2)


Singkatnya, ya, driver ODBC hanya memerlukan unduhan tambahan untuk pyodbc.

PyODBC adalah Python DB-API terbuka yang menerima ODBC yang mematuhi apa pun driver dari sumber data apa saja (Oracle, SQL Server, PostgreSQL, SalesForce, Quickbooks, dll.). Driver ODBC berfungsi sebagai lapisan tengah antara klien (yaitu, Python) dan server basis data dan, seperti perangkat lunak apa pun, driver tersebut dapat dikembangkan oleh vendor berpemilik (misalnya, Oracle, Microsoft), pengembang/grup sumber terbuka, atau pihak ketiga. . Selain itu, ODBC adalah teknologi yang diakui di antara banyak platform seperti Excel dan bahasa.

Tidak seperti DB-API Python lainnya (pymysql, cxOracle, psycopg2), pyodbc seperti yang Anda kenali memiliki satu persyaratan: driver ODBC yang ditentukan dalam kode harus diinstal terlebih dahulu di mesin klien (bukan hanya perpustakaan Python yang diinstal). Omong-omong, ini sangat mirip dengan driver JDBC dengan jaydebeapi Python dan Microsoft mempertahankan JDBC driver untuk SQL Server.

Kolega Anda menerima kesalahan berikut:

Tidak ditemukan driver yang cocok. Tidak dapat terhubung.

karena driver ODBC spesifik tersebut tidak diinstal pada mesin mereka tetapi diinstal pada mesin Anda. Mintalah mereka memeriksa versi apa yang tersedia untuk mereka dengan perintah:

pyodbc.drivers()

Sebagai latar belakang, Microsoft memelihara beberapa driver ODBC (dari berbagai versi yang kompatibel) untuk mesin Windows, Linux, dan MacOS. Karena MS Excel tidak memiliki lapisan database asli, biasanya MS Excel terhubung dengan ODBC atau OLEDB tetapi dengan perpustakaan seperti DAO atau ADO (mitra dengan perpustakaan Python, pydobc). Mungkin rekan Anda yang lain memiliki versi lain seperti:

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

Oleh karena itu, jika Anda akan mengedarkan kode Anda yang terintegrasi ke dalam file yang dapat dieksekusi ke pengguna lain, jangan melakukan hard-code kredensial ODBC apa pun karena seperti yang Anda tunjukkan, lingkungan CPU sangat bervariasi. Sebagai gantinya, pertimbangkan tiga solusi di bawah ini:

  1. Nama Sumber Data: Buat Nama Sumber Data (DSN) disesuaikan secara individual untuk setiap mesin pengguna yang dapat bervariasi antara driver, server, nama pengguna, kata sandi yang berbeda, dll.

    cnxn = pyodbc.connect(dsn="myDatabase")
    
  2. File Konfigurasi: Gunakan file konfigurasi seperti yaml atau json dengan semua kredensial terdaftar dalam folder aman dan kemudian diintegrasikan ke dalam koneksi. Banyak tutorial online tentang ini.

    YAML

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

    ular piton

    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. Variabel Lingkungan: Gunakan variabel lingkungan yang disetel secara permanen atau sementara di mesin pengguna sebelum koneksi.

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

Jelajahi web untuk dokumentasi, tutorial, blog, bahkan postingan SO lainnya tentang cara memecahkan masalah. Di atas adalah contoh sederhana yang mungkin memerlukan penyesuaian.

person Parfait    schedule 27.03.2020
comment
Memang benar pertanyaan saya diutarakan dengan buruk. Seharusnya saya mengatakan Driver ODBC versus Driver ODBC 17. Dari jawaban Anda, saya melihat ada alternatif lain juga. Ini adalah postingan yang sangat informatif, dan saya akan mencoba menerapkan saran Anda. - person David Erickson; 28.03.2020
comment
Saya pikir terminologi adalah salah satu masalahnya. Ini dimulai sebagai komentar untuk Anda tetapi diperluas untuk menjawab. Saya memperbaruinya sesuai dengan itu. Jadi ya, driver ODBC hanyalah persyaratan lain dengan pyodbc. Rekan-rekan harus dapat terhubung dengan versi driver mereka. - person Parfait; 28.03.2020
comment
Karena Anda telah memperbarui jawaban Anda, saya juga telah memperbarui pertanyaan saya, sehingga semuanya selaras. - person David Erickson; 28.03.2020

Singkatnya, jawaban atas pertanyaan ini ternyata adalah "Ya", tetapi saya tidak menghapusnya karena ini dapat bermanfaat dan berguna bagi orang-orang yang sedang meneliti cara berbagi python/SQL .exe dengan orang lain pengguna serupa dengan cara Anda berbagi Makro Excel.

Dengan asumsi pengguna berada di jaringan perusahaan kami, satu-satunya persyaratan adalah pengguna:

1) mengunduh file python .exe saya yang menggunakan perpustakaan: a) pyodbc dan b) pandas

2) mengunduh ODBC Driver for SQL Server, bergantung pada pengaturan SQL Server perusahaan Anda. Dalam kasus saya, saya meminta pengguna mengunduh ODBC Driver 17 for SQL Server: https://www.microsoft.com/en-us/download/details.aspx?id=56567

Ini berarti mereka tidak perlu menginstal SQL Server sepenuhnya, cukup drivernya saja!

person David Erickson    schedule 27.03.2020