使用 Windows 身份验证在 Python 中使用 SQL Alchemy 连接到网络上的 MS SQL

Connect to MS SQL on a network with SQL Alchemy in Python using Windows Authentication

我正在尝试使用 pandas.read_sql_table 从 MS SQL 服务器(服务器在网络上)获取数据。我使用 Windows 身份验证来访问服务器。 Pandas read_sql_table 将 SQL Alchemy 连接作为“连接”的参数。我很难找到结合以下内容的示例:

  1. SQL 炼金术
  2. MS SQL 服务器
  3. DSN(“首选” 根据 SQL 炼金术)
  4. 的规范
  5. Windows 认证

我查阅了 SQL Alchemy,它显示了一个使用 SQL 身份验证但未使用 Windows 身份验证的示例。 http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#connecting-to-pyodbc 以下是我尝试过的各种选项。全部return一个错误。

import pandas as pd
from sqlalchemy import create_engine
import pyodbc
# set some variables
dbname = 'mydbname'
schemaname = 'myschemaname'
servername = 'myservername'
tablename = ‘mytablename’

sqlcon = create_engine('mssql+pyodbc://@' + servername)
#sqlcon = create_engine('mssql+pyodbc://' + servername + '/' + dbname)
#sqlcon = create_engine('mssql+pyodbc://' + servername)
#sqlcon = create_engine('mssql://' + servername + '/' + dbname + '?trusted_connection=yes')
#sqlcon = create_engine('mssql+pyodbc://' + servername + '/' + dbname + '?trusted_connection=yes')
mydataframe = pd.read_sql_table(tablename,con=sqlcon,schema=schemaname)

我得到的错误是这样的:

(pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)') (Background on this error at: http://sqlalche.me/e/rvf5)

特别令人困惑的是没有指定默认驱动程序的评论。 None 的示例是指在我使用此 DSN 格式时指定默认驱动程序。

我参考了这个例子,对我来说也是失败的:How do I connect to SQL Server via sqlalchemy using Windows Authentication?

我可以很好地连接 SSMS。我正在使用 python 3.6.

我找到了问题的解决方案。发在这里供其他人参考。

此代码有效。不过,我无法避免明确指定驱动程序。

sqlcon = create_engine('mssql+pyodbc://@' + servername + '/' + dbname + '?driver=ODBC+Driver+13+for+SQL+Server')

如果您对驱动程序版本感到困惑,您可以使用下面的代码

username=<username>
password=<password>
server=<servername> | <host:port> 
database=<database>

#below code is with authentication
engine = create_engine('mssql+pyodbc://'+username+':'+password+'@' + server + '/' + database + '?driver=SQL+Server')
query = '''select * from <table>'''
result = engine.execute(query)


#below code is without authentication
engine = create_engine('mssql+pyodbc://@' + server + '/' + database + '?driver=SQL+Server')
query = '''select * from <table>'''
result = engine.execute(query)