如何使用Windows身份验证通过sqlalchemy连接到SQL Server?

时间:2014-06-06 15:19:17

标签: python sql-server sqlalchemy

sqlalchemy是Python的数据库连接模块,默认情况下使用SQL身份验证(数据库定义的用户帐户)。如果要使用Windows(域或本地)凭据对SQL Server进行身份验证,则必须更改连接字符串。

默认情况下,由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 Server自身引发的错误消息。此错误表示凭据不正确。

5 个答案:

答案 0 :(得分:29)

要使用sqlalchemy和mssql进行Windows身份验证,需要以下连接字符串:

OBDC驱动程序:

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

答案 1 :(得分:2)

如果您使用的是受信任的连接/ AD,而不使用用户名/密码,否则请参见以下内容:

  

SAWarning:未指定驱动程序名称;使用> DSN较少的连接时,PyODBC会期望这样做   “未指定驱动程序名称;”

然后此方法应该起作用:

from sqlalchemy import create_engine

server = <your_server_name>

database = <your_database_name>

engine = create_engine('create_engine('mssql+pyodbc://@' + server + '/' + database + '?trusted_connection=yes&driver=ODBC+Driver+13+for+SQL+Server')

答案 2 :(得分:1)

如果要从不同的用户连接到MSSQL DB,则是比Windows上登录的用户更新的响应。如果您从安装了FreeTDS的 Linux计算机进行连接,它也可以正常工作。

以下内容适用于Windows 10和Ubuntu 18.04(使用Python 3.6和3.7):

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)

所做的更改是在domain之前添加Windows \username。 您需要安装pymssql软件包。

答案 3 :(得分:0)

pyodbc

我认为您需要输入:

msp之后的

“ + 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()

对我有用

好运!

答案 4 :(得分:0)

从您的 pyodbc 连接字符串创建您的 SqlAlchemy 连接 URL

或您已知的连接参数

我发现所有其他答案都具有教育意义,并且我发现连接字符串上的 SqlAlchemy Docs 也很有帮助,但我一直无法连接到 MS SQL Server Express 19,在那里我没有使用用户名或密码和 trust_connection ='yes'(此时只是在做开发)。

然后我在从 pyodbc 连接字符串(或只是一个连接字符串)构建的连接 URL 的 SqlAlchemy Docs 中找到了 THIS 方法,它也是从已知的连接参数构建的(即这可以简单地认为是pyodbc 中不一定使用的连接字符串)。因为我知道我的 pyodbc 连接字符串正在工作,所以这似乎对我有用,而且确实如此!

此方法无需为您提供给 SqlAlchemy create_engine 方法的内容创建正确格式的猜测。如果您知道您的连接参数,您可以按照以下代码示例的文档将它们放入一个简单的字符串中,并且 sqlalchemy.engine 模块的 URL 类中的 create 方法会为您执行正确的格式设置。

下面的示例代码按原样运行,并假设一个名为 ma​​ster 的数据库和一个名为 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)