【问题标题】:Neither DSN nor SERVER keyword supplied未提供 DSN 和 SERVER 关键字
【发布时间】:2023-12-01 15:37:01
【问题描述】:

我正在尝试以稍微不同的方式连接到 SQL 数据库:使用和不使用参数。为什么不使用参数可以正常工作,但使用参数 - 给我一个错误。 我犯了语法错误吗? 我浏览了每封信,什么也没看到。

import pandas as pd
import pyodbc

#parameters:
server = 'SQLDEV'
db = 'MEJAMES'

#Create the connection
conn = pyodbc.connect('DRIVER={SQL Server};server =' + server + ';DATABASE = ' + db + ';Trusted_Connection=yes;')
# query db
sql = """

select top 10 PolicyNumber, QuoteID, ProducerName from tblQuotes

"""
df = pd.read_sql(sql,conn)
df

上面的语句给了我一个错误

但如果我做同样的事情但不使用参数,那么它工作正常:

import pandas as pd
import pyodbc

#parameters:
#server = 'SQLDEV'
#db = 'MEJAMES'

#Create the connection
conn = pyodbc.connect("DRIVER={SQL Server};server=SQLDEV;database=MEJAMES;Trusted_Connection=yes;")
# query db
sql = """

select top 10 PolicyNumber, QuoteID, ProducerName from tblQuotes

"""
df = pd.read_sql(sql,conn)
df

【问题讨论】:

  • 尝试删除server关键字后面的空格,即... ;server=' + server + ...而不是... ;server =' + server + ...
  • 成功了。我不敢相信 python 是这么挑剔的语言。我什至不会考虑这个。你能回答吗,我会接受正确的。非常感谢您的帮助。
  • 在这种情况下挑剔的是 SQLServer,而不是 Python,这并不重要..
  • @thebjorn - 实际上,罪魁祸首是 Windows ODBC 驱动程序管理器,而不是 SQL Server ODBC 驱动程序。任何其他 ODBC 驱动程序都会发生同样的事情。
  • @GordThompson 很酷,我今天学到了一些新东西 :-)

标签: python python-3.x pyodbc dsn


【解决方案1】:

Windows ODBC 驱动程序管理器对连接字符串中的关键字非常挑剔。它们必须紧跟等号,所以SERVER=... 可以工作,但SERVER =... 不行。

【讨论】:

    【解决方案2】:

    这很疯狂,但我设法通过实际传递一个选项来解决它:extra_params: server=WHEREYOURSERVERLIVES\DBSERVER

    我在 django BTW 上使用它 pyodbc。

    一定是一些错误。

    类似的东西

        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'YOURGREATESTDATABASE',
        'USER': 'YOURGREATESTUSERNAME',
        'PASSWORD': 'YOURGREATESTPASSWORD',
        'HOST': 'WHEREYOURSERVERLIVES\DBSERVER',
        'PORT': '',
    
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'extra_params': "Persist Security Info=False;server=WHEREYOURSERVERLIVES\\DBSERVER"
    

    【讨论】:

      【解决方案3】:

      试试这个格式:

      这应该可以工作

      connection = pyodbc.connect("DRIVER={/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.4.so.2.1};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s"
                                  % (server, database, username, password))
      

      【讨论】:

      • 我认为主要的误解是将 ODBC 连接字符串与您习惯使用的字符串混淆,谢谢。
      最近更新 更多