簡體   English   中英

如何使用 Windows 身份驗證通過 sqlalchemy 連接到 SQL 服務器?

[英]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 數據庫,這是一個更新的響應。 如果您從安裝了 FreeTDSLinux 機器連接,它也能正常工作。

以下使用 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 連接 URL
從您的 pyodbc 連接字符串
或您已知的連接參數

我發現所有其他答案都具有教育意義,我發現連接字符串上的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)

請參閱此鏈接以使用 SQL 服務器身份驗證創建連接字符串(非域,使用用戶名和密碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM