python-3.x - 使用 Python 3.6 和 pymssql 连接到 Sybase 数据库
问题描述
我正在尝试连接到 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), ..., ..., ...]
我尝试改用与 python 3.x 兼容的 te pymssql 包。
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
针对与数据库接口而不是数据库本身相关的错误引发。错误的子类。
你对如何处理这个有什么建议吗?
感谢帮助!
解决方案
找到了解决我的问题的方法:正如@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)
编辑:正如@GordThompson 建议的那样,在我的 pymssql.connect() 调用中使用 conn_properties = '' 也可以。
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)
谢谢你的帮助!
推荐阅读
- if-statement - Liquid:打印“If”或“Case”标签的所有可能输出
- django - django-orm 不区分大小写的 group by
- mysql - 如何将 sum 与 2 个不同的表一起使用?
- python - 我通过 python 构建了一个 webscraper,我想将它集成到一个电报机器人,但我一直得到一个默认页面
- python - 如何优化这个 python 练习?
- mongodb - 如何不仅更新所有文档中的值,还更新文档可以具有的文档数组中的值?
- javascript - 创建一次实例,然后从那里编辑
- pdf - 图像不出现 Canvas 和 jsPDF
- node.js - 本地主机 3000 和 5000 之间的区别?
- c++ - Arduino我如何编辑静态无符号短?