使用 Python 3.6 和 pymssql 连接到 Sybase 数据库

Posted

技术标签:

【中文标题】使用 Python 3.6 和 pymssql 连接到 Sybase 数据库【英文标题】:Connect to Sybase data base using Python 3.6 and pymssql 【发布时间】:2018-09-20 06:13:25 【问题描述】:

我正在尝试连接到 Sybase 数据库并从中检索数据。我正在使用安装了 Anaconda 存储库的 Ubuntu 18.04 系统,并希望使用 Python 3.6。

我找到了一种使用 python-sybase 包从数据库中检索数据的方法,但这依赖于 python 2.7,并且就我现在而言已经过时了。

import Sybase

db = Sybase.connect(dsn = server:port, user = usr, passwd = pwd, database = db)
c = db.cursor()
c.execute("select var1,var2,var3 from xxx where datum=1yymmdd and statnr=stat1")
list1 = c.fetchall()
print list1

这个脚本的输出是这样的:

[(10.8, 100, 0), (11.2, 100, 5), (11.3, 100, 10), ..., ..., ...]

我尝试改用 te pymssql 包,它与 python 3.x 兼容。

import pymssql
conn = pymssql.connect(server=serv:port,user=usr,password=pwd,database=db)
print(conn)
cursor = conn.cursor()
cursor.execute("select var1,var2,var3 from xxx where datum=1yymmdd and statnr=stat1")
list2 = cursor.fetchall()
print(list2) 

但是在尝试连接到数据库之后已经收到以下错误消息,因为它不执行 print(conn):

Traceback (most recent call last):
File "src/pymssql.pyx", line 636, in pymssql.connect
File "src/_mssql.pyx", line 1957, in _mssql.connect
File "src/_mssql.pyx", line 707, in _mssql.MSSQLConnection.__init__
_mssql.MSSQLDriverException: Could not set connection properties

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/progs/Test_SYBASE.py", line 9, in <module>
conn =  pymssql.connect(server=serv,user=usr,password=pwd,database=db,port=prt)
File "src/pymssql.pyx", line 645, in pymssql.connect
pymssql.InterfaceError: Could not set connection properties

所以我的问题实际上与连接本身有关。

我阅读了 pymssql 手册中的错误消息,但不知道如何处理。

异常 _mssql.MSSQLDriverException 每当 _mssql 中出现问题时,都会引发 MSSQLDriverException - 例如。数据结构内存不足,等等。

异常 pymssql.InterfaceError 针对与数据库接口而非数据库本身相关的错误引发。 Error 的子类。

您对如何处理有什么建议吗?

感谢您的帮助!

【问题讨论】:

What is the best way to connect to a sybase database from python?的可能重复 @GordThompson 感谢您链接其他问题帖子,我在发布问题之前阅读了它,但它似乎对我不起作用。我稍微编辑了上面的帖子,以更清楚地了解我遇到的问题。据我了解,我在建立连接时遇到问题,它甚至没有开始读数。这很奇怪,因为使用 python-sybase 模块可以很好地处理完全相同的登录变量... This comment on GitHub 建议您可以将conn_properties='' 添加到您的pymssql.connect 通话中。尽管如此,由于 pymssql 确实不是为支持 Sybase(仅支持 MS SQL)而设计的,所以我倾向于使用 pyodbc 和 FreeTDS_ODBC 而不是 pymssql。 感谢您的评论。我设法使用 pyodbc 和 FreeTDS 进行连接。 【参考方案1】:

找到了解决我的问题的方法: 正如@GordThompson 所建议的,我使用 pyodbc 和 FreeTDS 进行连接。 我通过

安装了 FreeTDS 驱动程序
sudo apt-get install freetds-dev freetds-bin unixodbc-dev tdsodbc
sudo dpkg-reconfigure tdsodbc

这里建议:https://gist.github.com/rduplain/1293636

我的连接代码如下所示:

import pyodbc
serv = server
usr = user 
passwd = password
db = database
prt = port
driver="FreeTDS"

conn = pyodbc.connect(driver=driver, server=serv, database=db,port = prt,
                  uid=usr, pwd=passwd)
print(conn)
cursor = conn.cursor()
cursor.execute("select var1,var2,var3 from xxx where datum=1yymmdd and statnr=stat1")
row = cursor.fetchall()
print(row)

编辑:在我的 pymssql.connect() 调用中使用 conn_properties = '' 也可以,正如@GordThompson 建议的那样。

import pymssql
conn =pymssql.connect(server=serv:port,user=usr,password=pwd,database=db, conn_properties='')
print(conn)
cursor = conn.cursor()
cursor.execute("select var1,var2,var3 from xxx where datum=1yymmdd and statnr=stat1")
list2 = cursor.fetchall()
print(list2)

感谢您的帮助!

【讨论】:

以上是关于使用 Python 3.6 和 pymssql 连接到 Sybase 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 pymssql 连接到 SQL Server 实例

无法使用 mod_wsgi 从 python wsgi 连接到 pymssql

使用 pymssql 2.2 未连接到 SQL 服务器

Python pymssql - 连接到命名实例

无法使用 pymssql 烧瓶连接到 ms sql 服务器

python pymssql连接报错,内存不足?