MSSQL django_pyodbc 连接问题

Posted

技术标签:

【中文标题】MSSQL django_pyodbc 连接问题【英文标题】:MSSQL django_pyodbc connectivity issues 【发布时间】:2018-09-25 14:52:11 【问题描述】:

我正在尝试在 django-pyodbc 的帮助下连接到 MSSQL。我已经安装了所有必需的软件包,例如 FreeTDS、unixODBC 和 django-pyodbc。当我使用 tsql 和 isql 连接时,我能够连接:-

>tsql -S mssql -U ********* -P ***********
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> 

isql -v mssql ********* ***********
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> 

但是,当我尝试从 python 连接时,它不起作用。我收到以下错误:-

>python
Python 2.7.14 (default, May 16 2018, 06:48:40)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyodbc;
>>> print(pyodbc.connect("DSN=GB0015APP09.dir.dbs.com;UID=*********;PWD=*************").cursor().execute("select 1"));
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')
>>>

我已经检查了所有其他相关的答案,但没有任何效果。不确定它正在寻找哪个数据源名称。

以下是所有相关配置:-

/root>cat .freetds.conf
[mssql]
host = my_server_name
instance = MSSQL
Port = 1433
tds version =

/root>cat /etc/odbc.ini
[ServerDSN]
Driver = FreeTDS
Description = FreeTDS
Trace = No
Servername = mssql
Server = my_server_name
Port = 1433
Database = my_db_name


/root>cat /etc/odbcinst.ini
[FreeTDS]
Description = FreeTDS
Driver = /usr/lib64/libtdsodbc.so
Setup = /usr/lib64/libtdsS.so
fileusage=1
dontdlclose=1
UsageCount=1

我已经浪费了几天时间试图解决这个问题,但没有运气。

请帮帮我。

编辑

/root>tsql -C
Compile-time settings (established with the "configure" script)
                            Version: freetds v0.95.81
             freetds.conf directory: /etc
     MS db-lib source compatibility: yes
        Sybase binary compatibility: yes
                      Thread safety: yes
                      iconv library: yes
                        TDS version: 4.2
                              iODBC: no
                           unixodbc: yes
              SSPI "trusted" logins: no
                           Kerberos: yes
                            OpenSSL: no
                             GnuTLS: yes

/root>odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

【问题讨论】:

请edit 您的问题包含tsql -Codbcinst -j 命令的输出。 @GordThompson 请看一看。谢谢 【参考方案1】:

试试:

con = pyodbc.connect("DSN=GB0015APP09.dir.slb.com;UID=**;PWD=**;TDS_Version=7.2")
cursor = con.cursor()

results = cursor.execute("SELECT 1")
print(results)

TDS_Version=7.2 是关键。

我已经开始在 Django 中使用 MSODBC 驱动程序而不是 FreeTDS。如果您有兴趣了解一下,see here。

【讨论】:

最后,在迁移到 django-pyodbc-azure 后,错误得到了解决。 感谢您的建议【参考方案2】:

当 unixODBC 在连接字符串中看到 DSN=GB0015APP09.dir.slb.com 时,它会在 odbc.ini 文件(由 odbcinst -j 列出)中查找以 [GB0015APP09.dir.slb.com] 开头的条目。它没有找到,所以它会抛出您引用的“找不到数据源名称...”错误。

如果您想在连接字符串中提供服务器名称(“无 DSN 连接”),您需要将 DSN=GB0015APP09.dir.slb.com 更改为 SERVER=GB0015APP09.dir.slb.com。您还需要在连接字符串中提供其他基本连接属性 (DRIVER=...;DATABASE=...)。请注意@FlipperPA 的答案中提到的TDS_Version=7.2 属性;它可以避免与 FreeTDS 默认使用旧的 4.2 版本的 TDS 协议相关的头痛。

【讨论】:

我搬到了 django-pyodbc-azure 并且错误得到了解决。不管怎样,谢谢你的建议。

以上是关于MSSQL django_pyodbc 连接问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP连接mssql问题

无法使用 FreeTDS 连接 MSSQL 服务器

PHP连接MSSQL数据库的方法,PHPWAMP如何连接MSSQL数据库(极度详细)

从 php 连接 mssql 服务器

节点 mssql 并发请求导致“连接已关闭”

MSSQL over PHP 的连接错误