通过DSN连接ODBC出现错误

3

我有一个问题,尝试通过pyodbc.connect调用我的uid和密码。

这是我的odbc.ini文件:

[my_dsn]
Driver= SQL Server
Server=my_server
User=uid_reader
Password=password_reader
MultiSubnetFailover=Yes
Database=master

当我硬编码时,它可以完美地工作并连接。

test_uid = 'uid_reader'
test_password = 'password_reader'

conn = pyodbc.connect(r'DSN=my_dsn;UID={a};PWD={b}'.format(a=test_uid,b=test_password))

当我从odbc.ini中调用我的dsn变量时,它无法工作。
conn = pyodbc.connect(r'DSN=my_dsn;UID=User;PWD=Password')

错误:('28000',"[28000] [unixODBC][Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'User'. (18456) (SQLDriverConnect)")

我想在odbc.ini文件中隐藏密码,这样当我调用pyodbc.connect时,密码就不会显示出来。


错误信息显示 User 被用作 UID 的值。如果在连接字符串中不指定用户和密码会发生什么? - mhawke
我运行了 conn = pyodbc.connect(r'DSN=my_dsn'),但它返回错误:('28000',"[28000] [unixODBC][Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect)")。 - antoinem
你是如何加载配置的?这行代码 conn = pyodbc.connect(r'DSN=my_dsn;UID=User;PWD=Password') 似乎应该使用 my_dsnUserPassword 的字面字符串值。我的理解是,你应该像在硬编码版本中那样进行字符串格式化,但是不要指向变量,而是指向加载的配置。 - r.ook
2个回答

0

这行代码 conn = pyodbc.connect(r'DSN=my_dsn;UID=User;PWD=Password') 似乎使用了字面字符串值 my_dsnUserPassword。你可以尝试使用关键字 像这里的文档,或者做一个类似于硬编码解决方案的字符串格式化,但是用加载的配置数据替换它。

文档中看来,你应该能够直接从 ini 文件中加载 DSN 信息,但我自己也没有取得太大的成功。注意文档只说可能可以使用登录凭据,所以可能取决于驱动程序?

无论如何,下面是一个使用 configparser 的版本,应该可以工作。对于一些人来说,这可能被认为是一个 hack。

import pyodbc
from configparser import ConfigParser

config = ConfigParser()
config.read(configfile)   # your odbc.ini file path and name
dsn = config['my_dsn']

#If you want to use Keywords:

conn = connect(driver=dsn['driver'], server=dsn['server'], database=dsn['database'], uid=dsn['user'], pwd=dsn['password'])

#If you want to use string formatting with list comprehension instead:
conn = pyodbc.connect(''.join(['{0}={1}; '.format(k, l) for k, l in d.items()])

一个小技巧,但它仍然有效并且可以隐藏密码。谢谢。 - antoinem

0

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