SQLAlchemy PyODBC MS SQL Server DSN-less 连接

3

使用Python 2.7和通过pyodbc的MS ODBC驱动程序。我的连接字符串如下:

mssql+pyodbc://myuser:mypass@serverip/instancename?driver=ODBC+Driver+11+for+SQL+Server

我遇到了登录失败的问题。但是,如果我在Microsoft SQL Server Management Studio中使用相同的凭据和“serverip\instancename”,我可以连接。

让我疯狂的事情是,几天前,这个相同的连接字符串对于同一台机器上的不同SQL服务器实例对我有效。因此,我正在尝试找出如何进行故障排除。

感谢任何提示。


这是哪个操作系统?这也是同一个客户端吗(可能与驱动程序未安装有关)? - van
驱动程序已安装。客户端是Debian Linux。 有一件让我有点困惑的事情是"实例名称"与"数据库"的术语。这个物理服务器上有多个SQL服务器实例。而我感兴趣的特定SQL服务器实例有多个数据库。在这里,我所说的数据库是指你在SQL语句中使用"use db1"的意思。 - Jay
我认为你需要一个反斜杠(\ )来指定实例名称,并在斜杠(/)后面放置数据库名称。所以也许 mssql+pyodbc://myuser:mypass@serverip\instancename?driver=ODBC+Driver+11+for+SQL+Server 可以解决问题? - van
我也尝试过反斜杠,谢谢你的建议。我最新的理论是,MS SQL Server在同一台物理服务器(操作系统)上的不同命名实例使用不同的端口。因此,连接到命名实例可能只是指定该命名实例的端口号的问题。我只需要得到一些系统管理员的帮助来尝试这个,并且现在是周末,所以没有机会。 - Jay
回复:“我登录失败了。但是如果我在Microsoft SQL Server Management Studio中使用相同的凭据和“serverip\instancename”,我可以连接。” - 请参阅此答案以获取解释。 - Gord Thompson
2个回答

2
我刚刚经历了这个问题,失败的原因是端口不同,每个实例都监听不同的端口,因此您需要指定哪个端口是属于该实例的。
我的代码如下:
DBserver='host.abc.nt'
DBengine='devenv'
DBport='####'
DBname='mydb'
DBDriver='ODBC Driver 13 for SQL Server'
DBuser='user'
DBpwd='pass'
DBuserpass = DBuser if len(DBuser) > 0 else ''
DBuserpass = DBuserpass + ':' + DBpwd if len(DBuser) > 0 else ''
if len(DBengine) > 0:
    DBserver = DBserver + '\\' + DBengine 

engine = sa.create_engine(f'''mssql+pyodbc://{DBuserpass}@{DBserver}:{DBport}/{DBname}?driver={DBDriver}''')

query=engine.execute('SELECT DB_NAME(), @@SERVERNAME')
query.fetchall()
[('mydb', 'host\\devenv')]

当你创建引擎时,除了SQLAlchemy之外,没有其他库是必需的。
但是,如果你想知道实例的端口号,可以使用以下方法: 来自gordthompson/sqlserverport的Github存储库 或者在Windows中,你可以连接到SQL Studio(或其他任何工具),对数据库进行一些查询,并同时在CMD中运行netstat以获取端口号:
C:\Users\pla>netstat -qfa | findstr host
 TCP    10.0.0.1:##87     host.abc.nt:4096  ESTABLISHED

2

当我学习SQLAlchemy时,我遇到了同样的问题。以下方法适用于我:

import urllib
params = urllib.quote_plus("DRIVER={SQL Server Native Client 10.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password")

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)

这段文字来自 sqlalchemy 文档。它似乎与登录凭据无关,但我遇到了相同的错误信息并且这个方法奏效了。

参考 http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#pass-through-exact-pyodbc-string


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接