[英]How to use Windows authentication for SQL Server from a Linux host with SQLAlchemy?
[英]How do I connect to SQL Server via sqlalchemy using Windows Authentication?
sqlalchemy,Python的數據庫連接模塊,默認使用SQL認證(數據庫定義的用戶賬戶)。 如果要使用 Windows(域或本地)憑據對 SQL 服務器進行身份驗證,則必須更改連接字符串。
默認情況下,按照sqlalchemy的定義,連接到SQL Server的連接字符串如下:
sqlalchemy.create_engine('mssql://*username*:*password*@*server_name*/*database_name*')
如果使用您的 Windows 憑據,則會拋出類似於此的錯誤:
sqlalchemy.exc.DBAPIError: (Error) ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456)") None None
在此錯誤消息中,代碼 18456 標識由 SQL 服務器本身拋出的錯誤消息。 此錯誤表示憑據不正確。
為了在 sqlalchemy 和 mssql 中使用 Windows 身份驗證,需要以下連接字符串:
ODBC 驅動程序:
engine = sqlalchemy.create_engine('mssql://*server_name*/*database_name*?trusted_connection=yes')
SQL Express 實例:
engine = sqlalchemy.create_engine('mssql://*server_name*\\SQLEXPRESS/*database_name*?trusted_connection=yes')
如果您使用的是受信任的連接/AD 並且未使用用戶名/密碼,或者以其他方式查看以下內容:
SAWarning:未指定驅動程序名稱; 這是 PyODBC 在使用 >DSN-less 連接時所期望的“未指定驅動程序名稱;”
那么這個方法應該有效:
from sqlalchemy import create_engine
server = <your_server_name>
database = <your_database_name>
engine = create_engine('mssql+pyodbc://' + server + '/' + database + '?trusted_connection=yes&driver=ODBC+Driver+13+for+SQL+Server')
如果您想從與您在 Windows 上登錄的用戶不同的用戶連接到 MSSQL 數據庫,這是一個更新的響應。 如果您從安裝了 FreeTDS的Linux 機器連接,它也能正常工作。
以下使用 Python 3.6 和 3.7 從 Windows 10 和 Ubuntu 18.04 對我有用:
import getpass
from sqlalchemy import create_engine
password = getpass.getpass()
eng_str = fr'mssql+pymssql://{domain}\{username}:{password}@{hostip}/{db}'
engine = create_engine(eng_str)
改變的是在\\username
之前添加 Windows domain
。 您需要安裝pymssql
包。
我認為你需要把:
mssql 后的“+pyodbc”
嘗試這個:
from sqlalchemy import create_engine
engine = create_engine("mssql+pyodbc://user:password@host:port/databasename?driver=ODBC+Driver+17+for+SQL+Server")
cnxn = engine.connect()
這個對我有用
運氣!
我發現所有其他答案都具有教育意義,我發現連接字符串上的SqlAlchemy Docs也很有幫助,但我一直無法連接到 MS SQL Server Express 19,在那里我沒有使用用戶名或密碼,並且 trust_connection='yes'(只是在這一點上做開發)。
然后我在 SqlAlchemy Docs on Connection URLs 中找到了這個方法,它是從 pyodbc 連接字符串(或只是一個連接字符串)構建的,它也是從已知的連接參數構建的(即這可以簡單地被認為是一個不一定是連接字符串在pyodbc中使用)。 因為我知道我的 pyodbc 連接字符串正在工作,所以這似乎對我有用,而且確實如此!
此方法無需為您提供給 SqlAlchemy create_engine 方法的內容創建正確格式的猜測。 如果您知道您的連接參數,您可以按照以下代碼示例的文檔將它們放入一個簡單的字符串中,並且 sqlalchemy.engine 模塊的 URL 類中的 create 方法會為您執行正確的格式設置。
下面的示例代碼按原樣運行,並假設一個名為master的數據庫和一個名為table_one的現有表,其架構如下所示。 另外,我正在使用 Pandas 導入我的表數據。 否則,我們希望使用上下文管理器來管理與數據庫的連接,然后像 SqlAlchemy 文檔中的HERE那樣關閉連接。
import pandas as pd
import sqlalchemy
from sqlalchemy.engine import URL
# table_one dictionary:
table_one = {'name': 'table_one',
'columns': ['ident int IDENTITY(1,1) PRIMARY KEY',
'value_1 int NOT NULL',
'value_2 int NOT NULL']}
# pyodbc stuff for MS SQL Server Express
driver='{SQL Server}'
server='localhost\SQLEXPRESS'
database='master'
trusted_connection='yes'
# pyodbc connection string
connection_string = f'DRIVER={driver};SERVER={server};'
connection_string += f'DATABASE={database};'
connection_string += f'TRUSTED_CONNECTION={trusted_connection}'
# create sqlalchemy engine connection URL
connection_url = URL.create(
"mssql+pyodbc", query={"odbc_connect": connection_string})
""" more code not shown that uses pyodbc without sqlalchemy """
engine = sqlalchemy.create_engine(connection_url)
d = {'value_1': [1, 2], 'value_2': [3, 4]}
df = pd.DataFrame(data=d)
df.to_sql('table_one', engine, if_exists="append", index=False)
如果您嘗試連接: DNS-less Windows 對非本地托管的服務器進行身份驗證。 不使用 ODBC 連接。
嘗試以下操作:
import sqlalchemy
engine = sqlalchemy.create_engine('mssql+pyodbc://' + server + '/' + database + '?trusted_connection=yes&driver=SQL+Server')
這避免了使用 ODBC 連接,從而避免了 DPAPI2 與 DBAPI3 沖突引起的 pyobdc 接口錯誤。
我建議使用 URL 創建工具,而不是從頭開始創建 url。
connection_url = sqlalchemy.engine.URL.create("mssql+pyodbc",database=databasename, host=servername, query = {'driver':'SQL Server'})
engine = sqlalchemy.create_engine(connection_url)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.