我正在尝试仅使用连接字符串中的DSN名称设置pyodbc连接(主要目标是在连接字符串中不包含密码),如下所示:
import pyodbc
cxxn = pyodbc.connect("DSN=HARSHIT_CON")
这是我的.odbc.ini
文件:
[HARSHIT_CON]
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1
Description=python
Database=my_db
Server=someserver,2500
user=harshitjindal
password=penguincontrolgroup
QuotedId=Yes
AnsiNPW=Yes
预期结果:因为在.odbc.ini
文件中定义了用户名和密码,所以要建立连接,但我得到以下错误:
Traceback (most recent call last):
File "hjind1/testdb.py", line 2, in <module>
cxxn = pyodbc.connect("DSN=HARSHIT_CON")
pyodbc.InterfaceError: ('28000', "[28000] [unixODBC][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect)")
我已经尝试过了:
- 为了检查是否正在读取正确的
.odbc.ini
文件,我尝试删除.odbc.ini
文件,回溯显示未找到DSN。这使我相信ini文件正在被读取。 - 我注意到错误说
Login failed for user ''.
。我认为user_id没有被检测到,所以我在ini文件中添加了以下行(希望UID
而不是user
和PWD
而不是password
可能会有所帮助):
UID=harshitjindal
PWD=penguincontrolgroup
- 为了尝试解决未被检测到的用户问题,我还尝试在连接字符串中手动传递它,如:
cxxn = pyodbc.connect("DSN=HARSHIT_CON;UID=harshitjindal")
。这一次,错误消息显示用户是harshitjindal
,但是连接失败。如果我还在连接字符串中传递密码,如cxxn = pyodbc.connect("DSN=HARSHIT_CON;UID=harshitjindal;PWD=penguincontrolgroup")
,那么它就可以工作,但整个想法是从连接字符串中删除密码,当它已经在ini文件中定义时。
我如何在没有显式传递密码的情况下设置我的连接(从DSN配置中读取)?
技巧是要认识到.odbc.ini
文件需要像配置文件一样对待。这是不直观的,因为其他参数,如Driver
,Server
,Database
是在调用pyodbc.connect()
时隐式地从ini文件读取,但user
和password
(或UID
和PWD
)需要显式地读取。
可以这样做:
import pyodbc
from ConfigParser import ConfigParser
config = ConfigParser()
config.read("/Users/harshitjindal/.odbc.ini") # odbc file path
DSN = "HARSHIT_CON"
cxxn = pyodbc.connect("DSN={0};UID={1};PWD={2}".format(DSN, config.get(DSN, "user"), config.get(DSN, "password")))