เมื่อแชร์ 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 เป็น Python DB-API แบบปลายเปิดที่ยอมรับ ODBC ที่สอดคล้องกับ ใดๆ ไดรเวอร์จากแหล่งข้อมูล ใดๆ (Oracle, SQL Server, PostgreSQL, SalesForce, Quickbooks ฯลฯ) ไดรเวอร์ ODBC ทำหน้าที่เป็นชั้นกลางระหว่างไคลเอ็นต์ (เช่น Python) และเซิร์ฟเวอร์ฐานข้อมูล และเช่นเดียวกับซอฟต์แวร์อื่นๆ ไดรเวอร์เหล่านี้สามารถได้รับการพัฒนาโดยผู้จำหน่ายที่เป็นกรรมสิทธิ์ (เช่น Oracle, Microsoft) นักพัฒนา/กลุ่มโอเพ่นซอร์ส หรือบุคคลที่สาม . นอกจากนี้ 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 ใดๆ เนื่องจากตามที่คุณสาธิต สภาพแวดล้อมของ CPU จะแตกต่างกันอย่างมาก ให้พิจารณาวิธีแก้ปัญหาสามประการด้านล่างแทน:

  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

โดยสรุป คำตอบสำหรับคำถามนี้กลายเป็น "ใช่" แต่ฉันไม่ได้ลบ เนื่องจากอาจเป็นประโยชน์และเป็นประโยชน์สำหรับผู้ที่กำลังค้นคว้าวิธีแบ่งปัน python/SQL .exe กับผู้อื่น ผู้ใช้ที่คล้ายกับวิธีที่คุณอาจแชร์ Excel Macro

สมมติว่าผู้ใช้อยู่ในเครือข่ายบริษัทของเรา ข้อกำหนดเพียงอย่างเดียวคือผู้ใช้:

1) ดาวน์โหลดไฟล์ python .exe ของฉันที่ใช้ไลบรารี: a) pyodbc และ b) pandas

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