This post is in regards to connecting to SQL Server using pyodbc.
Install package
- pip install pyodbc
If you are running in Databricks then the current driver will be “{ODBC Driver 17 for SQL Server}”.
If you are running in Synapse then the current driver will be “{ODBC Driver 18 for SQL Server}”.
Check pyodbc Version
- import pyodbc
- pyodbc.drivers()
Check Which Version of pyodbc in Databricks
- %sh
- cat /etc/odbcinst.ini
Install Databricks driver 17
- curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
- curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
- apt-get update
- ACCEPT_EULA=Y apt-get install msodbcsql17
- apt-get -y install unixodbc-dev
Connect using SQL Auth
I do not recommend SQL Auth
- import pyodbc
- secret = "<GET SECRET SECURELY>"
- connection = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};Server=tcp:<SERVER_NAME>;PORT=<PORT>;Database=<DATABASE>;Uid=<USER>;Pwd=<SECRET>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=<TIMEOUT>;')
Connect Using Domain Auth
- import pyodbc
- secret = "<GET SECRET SECURELY>"
- connection = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};Server=tcp:<SERVER_NAME>;PORT=<PORT>;Database=<DATABASE>;Uid=<USER>;Pwd=<SECRET>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=<TIMEOUT>;Authentication=ActiveDirectoryPassword')
Connect using Azure SPN
- pip install msal
- import struct
- import msal
- global_token_cache = msal.TokenCache()
- secret = "<GET SECRET SECURELY>"
- global_spn_app = msal.ConfidentialClientApplication(
- <CLIENT_ID>, Authority='https://login.microsoftonline.com/<TENANT_ID>',
- client_credential=secret,
- token_cache=global_token_cache,
- )
- result = global_spn_app.acquire_token_for_client(scopes=['https://database.windows.net//.default'])
- SQL_COPT_SS_ACCESS_TOKEN = 1256
- token = bytes(result['access_token'], 'utf-8')
- exptoken = b"";
- for i in token:
- exptoken += bytes({i});
- exptoken += bytes(1);
- token_struct = struct.pack("=i", len(exptoken)) + exptoken;
- connection = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};Server=tcp:<SERVER_NAME>;PORT=<PORT>;Database=<DATABASE>;Uid=<USER>;Pwd=<SECRET>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=<TIMEOUT>;' attrs_before = { SQL_COPT_SS_ACCESS_TOKEN:tokenstruct })
Once you have the connection you can setup the cursor.
- cursor = connection.cursor()
Then execute a command
- command = "<COMMAND>"
- params = ()
- cursor.execute(command, params)
- connection.commit()
After you Are finish Close
- cursor.close()
- connection.close()