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

jqjz2hbq  于 2022-12-28  发布在  Python
关注(0)|答案(6)|浏览(373)

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本身引发的错误消息。此错误表示凭据不正确。

3duebb1j

3duebb1j1#

为了将Windows身份验证与sqlalchemy和mssql一起使用,需要以下连接字符串:

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

twh00eeo2#

如果您使用的是可信连接/AD而不是用户名/密码,请参阅以下内容:
SAWarning:未指定驱动程序名称;这是PyODBC在使用〉无DSN连接时所期望的“未指定驱动程序名称;“
那么这个方法应该有效:

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

kulphzqa3#

如果您想从一个与您在Windows上登录时所用的用户不同的用户连接到MSSQL DB,则会出现更新的响应。如果您从安装了FreeTDSLinux计算机连接,则此响应同样有效。
下面的代码在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)

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

rdlzhqv9

rdlzhqv94#

脓块细胞

我认为你需要:
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()

对我很有效
好运!

doinxwow

doinxwow5#

创建您的SqlAlchemy连接URL

  从pyodbc连接字符串
  或已知的连接参数

我发现所有其他的答案都很有教育意义,我发现连接字符串上的SqlAlchemy Docs也很有帮助,但是我一直无法连接到MS SQL Server Express 19,在那里我没有使用用户名或密码,并且trusted_connection ='yes '(此时正在进行开发)。
然后我在SqlAlchemy文档中找到了这个方法,它是从一个pyodbc连接字符串(或者仅仅是一个连接字符串)构建的,这个连接字符串也是从已知的连接参数构建的(也就是说,这可以简单地认为是一个连接字符串,不一定在pyodbc中使用)。因为我知道我的pyodbc连接字符串是工作的,这看起来像是它会为我工作,它确实工作了!
此方法消除了为您提供给SqlAlchemy create_engine方法的内容创建正确格式时的猜测工作。如果您知道连接参数,则可以按照以下代码示例的文档将这些参数放入一个简单的字符串中,sqlalchemy. engine模块的URL类中的create方法会为您执行正确的格式设置。
下面的示例代码按原样运行,假设数据库名为master,现有表名为table_one,模式如下所示。另外,我使用panda导入表数据。否则,我们需要使用上下文管理器来管理与数据库的连接,然后关闭连接,如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)

更新

假设您已经在Linux机器上安装了SQL Server Express,您可以使用以下命令来确保为以下内容使用了正确的字符串:
1.对于驾驶员:第一个月
1.对于服务器:sqlcmd -S localhost -U <username> -P <password> -Q 'select @@SERVERNAME'

soat7uwm

soat7uwm6#

如果您尝试连接:非本地托管服务器的无DNS 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)

See this link for creating a connection string with SQL Server Authentication (non-domain, uses username and password)

相关问题