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

vbi*_*ovs 28 python sql-server sqlalchemy

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

默认情况下,由sqlalchemy定义,连接到SQL Server的连接字符串如下所示:

sqlalchemy.create_engine('mssql://*username*:*password*@*server_name*/*database_name*')
Run Code Online (Sandbox Code Playgroud)

如果使用您的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
Run Code Online (Sandbox Code Playgroud)

在此错误消息中,代码18456标识SQL Server自身引发的错误消息.此错误表示凭据不正确.

vbi*_*ovs 33

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

OBDC驱动程序:

engine = sqlalchemy.create_engine('mssql://*server_name*/*database_name*?trusted_connection=yes')
Run Code Online (Sandbox Code Playgroud)

SQL Express实例:

engine = sqlalchemy.create_engine('mssql://*server_name*\\SQLEXPRESS/*database_name*?trusted_connection=yes') 
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这对我没有用,但是却使我走上了正确的道路。这就是我必须使用的:sqlcon = create_engine('mssql + pyodbc:// @'+服务器名+'/'+ dbname +'?trusted_connection = yes&driver = ODBC + Driver + 13 + for + SQL + Server') ` (4认同)
  • 如果我们从使用Windows凭据登录的机器运行脚本,则上述连接字符串可能很有用.如果我需要从其他主机运行脚本怎么办? (3认同)
  • @DoloMike 是的,这个答案已经过时了。 (3认同)
  • @DoloMike 我希望我能为你的帖子再投票 10,000 次。 (2认同)

Ray*_*son 13

如果您使用的是受信任的连接/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')
Run Code Online (Sandbox Code Playgroud)


Tho*_*ves 9


从您的 pyodbc 连接字符串 \xc2\xa0\xc2\xa0\xc2
\xa0\xc2\xa0 或您已知的连接参数创建 SqlAlchemy 连接 URL \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0

\n

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

\n

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

\n

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

\n

下面的示例代码按原样运行,并假设有一个名为master的数据库和一个名为table_one的现有表,其架构如下所示。另外,我正在使用 pandas 导入表数据。否则,我们希望使用上下文管理器来管理与数据库的连接,然后关闭连接,如SqlAlchemy 文档中的此处。

\n
import pandas as pd\nimport sqlalchemy\nfrom sqlalchemy.engine import URL\n\n# table_one dictionary:\ntable_one = {\'name\': \'table_one\',\n    \'columns\': [\'ident int IDENTITY(1,1) PRIMARY KEY\',\n        \'value_1 int NOT NULL\',\n        \'value_2 int NOT NULL\']}\n\n# pyodbc stuff for MS SQL Server Express\ndriver=\'{SQL Server}\'\nserver=\'localhost\\SQLEXPRESS\'\ndatabase=\'master\'\ntrusted_connection=\'yes\'\n\n# pyodbc connection string\nconnection_string = f\'DRIVER={driver};SERVER={server};\'\nconnection_string += f\'DATABASE={database};\'\nconnection_string += f\'TRUSTED_CONNECTION={trusted_connection}\'\n\n# create sqlalchemy engine connection URL\nconnection_url = URL.create(\n    "mssql+pyodbc", query={"odbc_connect": connection_string})\n\n""" more code not shown that uses pyodbc without sqlalchemy """\n\nengine = sqlalchemy.create_engine(connection_url)\n\nd = {\'value_1\': [1, 2], \'value_2\': [3, 4]}\ndf = pd.DataFrame(data=d)\n\ndf.to_sql(\'table_one\', engine, if_exists="append", index=False)\n
Run Code Online (Sandbox Code Playgroud)\n

更新

\n

假设您已在 Linux 计算机上安装了 SQL Server Express。您可以使用以下命令来确保您使用的是正确的字符串:

\n
    \n
  1. 对于驾驶员:odbcinst -q -d
  2. \n
  3. 对于服务器:sqlcmd -S localhost -U <username> -P <password> -Q \'select @@SERVERNAME\'
  4. \n
\n


小智 5

pyodbc

我认为你需要输入:

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()
Run Code Online (Sandbox Code Playgroud)

这个对我有用

运气!


Wli*_*Wli 5

如果您想从与您在 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)
Run Code Online (Sandbox Code Playgroud)

改变的是domain\username. 您需要安装该pymssql软件包。