【问题标题】:What's causing 'unable to connect to data source' for pyodbc?是什么导致pyodbc“无法连接到数据源”?
【发布时间】:2012-03-15 16:09:33
【问题描述】:

我正在尝试从 Linux (SLES) 上的 python 连接到 MSSQL 数据库。

我已经安装了 pyodbc 和 Free TDS。从命令行:

tsql -H server -p 1433 -U username -P password

从 Python 连接到服务器没有问题:

import pyodbc
pyodbc.connect(driver='{FreeTDS}', server='server', database='database', uid='username', pwd='password')

产生错误:

pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')

我发现这个错误非常模糊。即使是缩小问题范围的建议现在也会有所帮助。

编辑: 查看 TDS 日志转储,这似乎是整个事情崩溃的地方:

token.c:328:tds_process_login_tokens()
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20017, 115)
odbc.c:2270:msgno 20017 20003
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
util.c:156:Changed query state from IDLE to DEAD
token.c:337:looking for login token, got  0()
token.c:122:tds_process_default_tokens() marker is 0()
token.c:125:leaving tds_process_default_tokens() connection dead
login.c:466:login packet accepted
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20002, 0)
odbc.c:2270:msgno 20002 20003
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
mem.c:615:tds_free_all_results()
error.c:412:odbc_errs_add: "Unable to connect to data source"

【问题讨论】:

    标签: python database tsql database-connection pyodbc


    【解决方案1】:

    我尝试:

    • MS SQL 2008 数据中心
    • Ubuntu 12.04 TLS (amd64)
    • Python 2.7

    这对我有用:

    测试连接:

    tsql -H 10.19.4.42 -p 1433 -U DAVIDG -P 123456
    

    在 /etc/odbcinst.ini 添加:

    [ODBC]
    Trace = Yes
    TraceFile = /tmp/odbc.log
    
    [FreeTDS]
    Description = TDS driver (Sybase/MS SQL)
    Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
    Setup =  /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
    UsageCount = 1
    

    在 /etc/odbc.ini 添加:

    [SQLDemo]
    Description=my dsn
    Driver=FreeTDS
    Database=teste3
    Servername=SQLDemo
    

    在 /etc/freetds/freetds.conf 添加:

    [SQLDemo]
            host = 10.19.4.42
            port = 1433
            tds version = 8.0
    

    用 test.py 测试:

    #!/usr/bin/python
    
    import pyodbc
    cnx = pyodbc.connect("DSN=SQLDemo;UID=DAVIDG;PWD=123456")
    
    cursor = cnx.cursor()
    cursor.execute("select * from Company;")
    for row in cursor:
      print row.Name
    

    【讨论】:

    • 了解服务器详细信息的一个非常有用的命令是 tsql -LH 主机名
    • 非常有用的答案。非常感谢! :)
    【解决方案2】:

    我遇到了同样的问题,我发现它在对connect() 的调用中缺少TDS_Version 参数。以下代码适用于我连接到 MS SQL Server 2008 的实例:

    import pyodbc
    
    driver = '/opt/local/lib/libtdsodbc.so' # Change this to where FreeTDS installed the driver libaray!
    
    conn = pyodbc.connect(
        driver = driver,
        TDS_Version = '7.2', # Use for
        server = '<hostname or ip address>',
        port = 1433,
        database = '<database>',
        uid = '<uid>',
        pwd = '<pwd>')
    

    【讨论】:

    • 为什么wiki中没有提到这个连接关键字语法?!使用 UnixODBC 和 FreeTDS 调试 Linux 环境的时代,这是可行的。
    【解决方案3】:

    兜了几个小时,结果发现我错过的只是

    TDS_Version = 8.0 在我的 odbc.ini 文件中的 DSN 中。

    我已经在别处指定了它,但显然它也需要在这里。

    希望这可以帮助其他一些可怜的人。

    【讨论】:

      【解决方案4】:

      将 TDS_Version 添加到连接字符串对我有用:

      connection_string = 'DRIVER={{FreeTDS}};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd};TDS_VERSION=8.0'

      【讨论】:

        【解决方案5】:

        只是为了一个额外的数据点,我的主机上的 odbc.ini 是空的,而 odbcinst.ini 有以下几行:

        # Driver from FreeTDS
        #
        [FreeTDS]
        Driver = /usr/lib64/libtdsodbc.so.0
        

        最后,freetds.conf 文件有以下几行:

        [global]
            host= <hostname>
            port= <mssql port>
            tds version = 8.0
        

        虽然您当然可以在 odbc.ini 中指定选项设置,但这样做可以让所有配置选项都在您期望的位置(freetds.conf 文件)进行管理。

        【讨论】:

        • 有趣。我确实在我的 freetds.conf 中将 tds 版本设置为 8.0,在全局和每个单独的 DSN 下都有。出于某种原因,它也只有在添加到其他位置后才起作用。
        • 哇,我刚刚遇到了完全相同的问题。在我手动将 tds version = 8.0 添加到 freetds.conf 文件之前,它在 Python 中不起作用。即使该文件中的 cmets 说它无关紧要,并且默认情况下它已被注释掉:!
        【解决方案6】:

        我的问题是,在我的设置文件中,我将 HOST 设置为 SQL Server IP,但是经过数小时的拉扯后,我发现必须将 HOST 设置为数据源名称 []

        【讨论】:

          【解决方案7】:

          在将我的 ubuntu 版本升级到 12.04 后,我也遇到了这个问题。我的旧 freetds 配置 /etc/freetds/freetds.conf 没有被发现,所以我不得不将它移动到 /usr/local/etc,此时它又开始工作了。

          我的司机位置也是/usr/local/lib/libtdsodbc.so

          希望这可以帮助某人节省一天半的时间!

          【讨论】:

            【解决方案8】:

            你也可以在你的python脚本中设置环境变量:

            os.environ['TDSVER'] = '8.0'
            

            【讨论】:

              【解决方案9】:

              一个设置就够了,/etc/odbcinst.ini:

              [FreeTDS]
              Description = FreeTDS Driver to MsSQL
              Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
              UsageCount = 1
              

              接下来:

              connection = pyodbc.connect(
                  'DRIVER=FreeTDS;'
                  'SERVER=<host_name_or_ip>;'
                  'PORT=1433;'
                  'DATABASE=<database>;'
                  'UID=<username>;'
                  'PWD=<password>;'
                  'TDS_VERSION=8.0;'
              )
              

              【讨论】:

                【解决方案10】:

                在我的情况下,当我 ping 到没有 ping 的服务器时,我的主机文件丢失了。然后我通过在终端中应用 sudo vi /etc/hosts 命令发现我的主机文件丢失了。我添加了我的主机和 IP 地址,对我来说效果很好。

                【讨论】:

                  【解决方案11】:

                  这对我有用,不确定但认为它可能对某人有所帮助

                  运行以下命令以查找您正在使用的 odbcinst 和 isql 版本

                   which odbcinst
                  
                   which isql
                  

                  然后运行 ​​$ odbcinst -j 以查找正在使用的 odbc.iniodbcinst.ini

                  odbcinst.ini添加

                  [FreeTDS]
                  Description=FreeTDS Driver for Linux & MSSQL
                  Driver=/usr/local/lib/libtdsodbc.so
                  Setup=/usr/local/lib/libtdsodbc.so
                  UsageCount=1
                  

                  odbc.ini 中配置你的服务器

                  [YOUR_SERVER]
                  Driver = FreeTDS
                  Servername = <YOUR_MACHINE_NAME>
                  Database = <Database_You_Want_To_Connect>
                  

                  我在https://docs.snowflake.net/manuals/user-guide/odbc-linux.html#unixodbc找到了一些很好的描述

                  也可以看看https://github.com/lionheart/django-pyodbc/wiki/Mac-setup-to-connect-to-a-MS-SQL-Server

                  【讨论】:

                    【解决方案12】:

                    在 Ubuntu 18.04 升级中断我的 pyodbc 连接后,我找到了我的方式。事实证明,在我的 //etc/odbcinst.ini 文件中,我的驱动程序描述顺序被切换了。

                    所以当我打电话时:

                    from pyodbc import connect,drivers
                    conn = connect(driver=drivers()[0], ...
                    

                    我应该打电话的:

                    conn = connect(driver=drivers()[1], ...  
                    

                    换句话说,由于一个简单的索引问题,我调用了错误的驱动程序。希望这对其他人有帮助。

                    【讨论】:

                      【解决方案13】:

                      以下对我有用:

                      修改python2.7/site-packages/sql_server/pyodbc/base.py

                      def get_new_connection(self, conn_params):
                      ...
                      -    cstr_parts['SERVERNAME'] = host
                      +    cstr_parts['SERVER'] = host
                      +    cstr_parts['PORT'] = str(port)
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-04-18
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2022-01-18
                        • 1970-01-01
                        • 2021-06-12
                        相关资源
                        最近更新 更多