异常值:('08001', '[08001] [unixODBC][FreeTDS][SQL Server]无法连接到数据源 (0) (SQLDriverConnect)')
我正在使用pyodbc库,从一个运行在Ubuntu虚拟机上的Python Django网页应用,连接到Windows上的远程SQL Server实例。
我有一个数据库连接类,如下所示,但在我尝试创建连接对象的那一行出错(我尝试了好几个连接字符串);
import pyodbc
class SQLSeverConnection():
def __init__(self, DSN, user, password, database):
connectionString = 'DSN=MSSQLServerDataSource;UID=django;PWD=password123!;DATABASE=HD'
self.connection = pyodbc.connect(connectionString)
self.cursor = self.connection.cursor()
def getTableNames(self):
self.cursor.execute('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = \'BASE TABLE\'')
tables = self.cursor.fetchall()
return tables
def getColumnTitles(self, tableName):
self.cursor.execute("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + tableName + "' ORDER BY ORDINAL_POSITION")
columns = self.cursor.fetchall()
return columns
def getColumnData(self, columnName, tableName, startDateTime, endDateTime):
self.cursor.execute('SELECT ' + columnName + ' FROM ' + tableName + ' BETWEEN ' + startDateTime + ' AND ' + endDateTime + ' ORDER BY timestamp')
data = self.cursor.fetchall()
return data
当我运行服务器时,出现了标题中描述的错误。
我的配置文件如下;
(odbc.ini)
[MSSQLServerDataSource]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Servername = MSSQLServer
Database = HD
TDS_Version = 8.0
(odbcinst.ini)
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
# Some installations may differ in the paths
#Driver = /usr/lib/odbc/libtdsodbc.so
#Setup = /usr/lib/odbc/libtdsS.so
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 4
(freetds.conf)
# $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about the layout of this file and its settings,
# see the freetds.conf manpage "man freetds.conf".
# Global settings are overridden by those in a database
# server specific section
[global]
# TDS protocol version
; tds version = 4.2
# Whether to write a TDSDUMP file for diagnostic purposes
# (setting this to /tmp is insecure on a multi-user system)
; dump file = /tmp/freetds.log
; debug flags = 0xffff
# Command and connection timeouts
; timeout = 10
; connect timeout = 10
# If you get out-of-memory errors, it may mean that your client
# is trying to allocate a huge buffer for a TEXT field.
# Try setting 'text size' to a more reasonable limit
text size = 64512
#Server For Django App
[MSSQLSever]
host = <ip>
port = 1433
tds version = 8.0
当我在终端输入odbcinst -j时;
unixODBC 2.2.14
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/user/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
我使用isql和DSN、用户名和密码从命令行连接是成功的。
我真的不知道该怎么办,已经在这上面转了超过一天了。如果能得到一些帮助,我将非常感激!
1 个回答
4
试试这个:
connectionString = 'DRIVER={FreeTDS};SERVER=10.1.3.230;PORT=1433;DATABASE=HD;UID=django;PWD=password123!;TDS_Version=7.2;'
你需要明确指定 TDS 版本。可以在这里查看你可以使用的不同 TDS 版本,我发现 7.2 在 2008 及之后的 SQL Server 上都能正常工作,一直到 2014:
http://www.freetds.org/userguide/choosingtdsprotocol.htm
在你的 Django pyodbc 设置中也需要这样做。我建议使用这个版本的 django-pyodbc:
https://github.com/lionheart/django-pyodbc/
祝你好运,如果有用的话告诉我哦。