设置pyodbc连接,连接字符串中没有密码



我正在尝试仅使用连接字符串中的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)")

我已经尝试过了:

  1. 为了检查是否正在读取正确的.odbc.ini文件,我尝试删除.odbc.ini文件,回溯显示未找到DSN。这使我相信ini文件正在被读取。
  2. 我注意到错误说Login failed for user ''.。我认为user_id没有被检测到,所以我在ini文件中添加了以下行(希望UID而不是userPWD而不是password可能会有所帮助):
UID=harshitjindal
PWD=penguincontrolgroup
  1. 为了尝试解决未被检测到的用户问题,我还尝试在连接字符串中手动传递它,如: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文件读取,但userpassword(或UIDPWD)需要显式地读取

可以这样做:

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")))

相关内容

  • 没有找到相关文章

最新更新