【问题标题】:Cannot establish connection to sql-server using pyodbc on Windows 7无法在 Windows 7 上使用 pyodbc 建立与 sql-server 的连接
【发布时间】:2013-09-22 12:39:30
【问题描述】:

我在 Windows 7 上使用 ActivePython 2.7.2.5。

在尝试使用以下代码通过 pyodbc 模块连接到 sql-server 数据库时,我收到了后续的 Traceback。关于我做错了什么有什么想法吗?

代码:

import pyodbc
driver = 'SQL Server'
server = '**server-name**'
db1 = 'CorpApps'
tcon = 'yes'
uname = 'jnichol3'
pword = '**my-password**'

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=server;DATABASE=db1;UID=uname;PWD=pword;Trusted_Connection=yes')
cursor = cnxn.cursor()
cursor.execute("select * from appaudit_q32013")
rows = cursor.fetchall()
for row in rows:
    print row

回溯:

Traceback (most recent call last):
  File "pyodbc_test.py", line 9, in <module>
    cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=server;DATABASE=db1;UID=uname;PWD=pword;Trusted_Connection=yes')
pyodbc.Error: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect); [01000] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53)')

【问题讨论】:

  • 在我的情况下,以下驱动程序名称对我有用。 'SQL Server Native Client 11.0' 和 'ODBC Driver 11 for SQL Server'
  • @HammadHassan:当我使用 pyodbc.dataSources() 时,这些没有被列为数据源。你知道如何导入/添加数据源吗?
  • @MSIS 据我所知,您必须安装一些东西才能使 ODBC/SQL Server... 驱动程序可用。

标签: python sql sql-server pyodbc activepython


【解决方案1】:

您正在使用'DRIVER={SQL Server};SERVER=server;DATABASE=db1;UID=uname;PWD=pword;Trusted_Connection=yes' 的连接字符串,您正在尝试连接到名为server 的服务器、名为db1 的数据库等。它不使用您之前设置的变量,它们'未使用。

可以将连接字符串参数作为关键字参数传递给connect 函数,因此您可以使用:

cnxn = pyodbc.connect(driver='{SQL Server}', host=server, database=db1,
                      trusted_connection=tcon, user=uname, password=pword)

【讨论】:

  • 做到了!非常感谢。
  • @JamesNicholson 您还需要从连接字符串中删除trusted_connection 属性,因为您提供了用户名和密码。您可以使用 Windows 身份验证(trusted_connection 属性)或 SQL Server 身份验证(userpassword 属性),但不能同时使用两者。在我的测试中,如果两者都提供,则连接默认为 Windows 身份验证。
  • @beargle 你能提交一个提供代码示例的答案吗?了解在这两种情况下如何构造连接字符串将非常有帮助。谢谢。
  • @JamesNicholson 请参阅此existing answer 显示pyodbc.connect SQL 和 Windows 身份验证示例。
  • @beargle 谢谢。使用其中一种是否存在安全风险?
【解决方案2】:

我收到了同样的错误消息,在我的情况下,问题是 [SQL Server] 驱动程序需要 TLS 1.0,它在我的服务器上被禁用。更改为新版本的 SNAC,SQL Server Native Client 11.0 解决了这个问题。

所以我的连接字符串看起来像:

cnxn = pyodbc.connect(driver='{SQL Server Native Client 11.0}', 
                      host=server, database=db1, trusted_connection=tcon,
                      user=uname, password=pword)

【讨论】:

    【解决方案3】:

    由于另一个原因,我遇到了这个错误。
    这是因为我的服务器除了地址之外还有一个“端口”。
    我可以通过将以下值分配给连接字符串的“Server”参数来解决这个问题。

    "...;Server=<server_name>,<port#>;..."
    

    请注意,它是“逗号”而不是“冒号”/“句号”

    【讨论】:

      【解决方案4】:

      这两种方法都存在不同的安全风险。如果您使用 Sql Server 身份验证,则会在代码中公开您的用户名/密码。但至少您使用相同的凭据进行处理。如果您使用 Windows 身份验证,则必须确保所有可能的用户都在 Sql 服务器中设置了正确的权限。使用 Sql 身份验证,您可以只设置一个用户,但多个人可以明智地使用该一个 Sql 用户权限。

      【讨论】:

        【解决方案5】:

        我今天遇到了同样的问题。我在连接字符串中使用 localhost 。通过将 localhost 替换为“服务器名称”来解决此问题。我的数据库和应用程序在同一台机器上运行。

        如果您没有服务器名称 转到 Sql server management studio 并执行以下查询,它将为您提供服务器名称。

        SELECT @@SERVERNAME
        

        连接字符串如下所示

        conn = pyodbc.connect('Driver={SQL Server};'
                              'Server=myServerName;'
                              'Database=mydb;'
                              'Trusted_Connection=yes;')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多