6

我目前正在使用sybpydb连接到 Sybase 15.7 服务器。似乎连接正常:

import sys
sys.path.append('/dba/sybase/ase/15.7/OCS-15_0/python/python26_64r/lib')
sys.path.append('/dba/sybase/ase/15.7/OCS-15_0/lib')
import sybpydb

conn = sybpydb.connect(user='usr', password='pass', servername='serv')

工作正常。更改我的任何连接详细信息都会导致连接错误。

然后我选择一个数据库:

curr = conn.cursor()
curr.execute('use db_1')

但是,现在当我尝试运行查询时,它总是返回None

print curr.execute('select * from table_1')

我试过在同一个中运行useselect查询execute,我试过在每个之后都包含go命令,我试过curr.connection.commit()在每个之后都使用,但都没有成功。我已经确认,使用dbartisanand isql,我使用的相同查询返回条目。

为什么我在 python 中的查询没有得到结果?

编辑:

只是一些额外的信息。为了使sybpydb导入工作,我不得不更改两个环境变量。我将库路径(与我添加到的相同sys.path)添加到$LD_LIBRARY_PATH,即:

setenv LD_LIBRARY_PATH "$LD_LIBRARY_PATH":dba/sybase/ase/15.7/OCS-15_0/python/python26_64r/lib:/dba/sybase/ase/15.7/OCS-15_0/lib

我不得不将SYBASE路径从 12.5 更改为 15.7。这一切都是在csh.

如果我打印 conn.error(),在每个 curr.execute() 之后,我得到:

("Server message: number(5701) severity(10) state(2) line(0)\n\tChanged database context to 'master'.\n\n", 5701)
4

2 回答 2

1

我完全理解您可能会对文档感到困惑的地方。它似乎无法与其他数据库扩展(例如 psycopg2)相提并论。

与大多数标准数据库扩展连接时,您可以指定一个数据库。然后,当您想从SELECT查询中取回数据时,您可以使用 fetch(一种好的方法)或迭代器(更 Pythonic的方法)。

import sybpydb as sybase

conn = sybase.connect(user='usr', password='pass', servername='serv')
cur = conn.cursor()

cur.execute("use db_1")
cur.execute("SELECT * FROM table_1")
print "Query Returned %d row(s)" % cur.rowcount

for row in cur:
    print row

# Alternate less-pythonic way to read query results
# for row in cur.fetchall():
#    print row

试一试,让我们知道它是否有效。

于 2012-12-29T19:01:06.117 回答
0

Python 3.x 工作解决方案:

import sybpydb

try:
    conn = sybpydb.connect(dsn="Servername=serv;Username=usr;Password=pass")
    cur = conn.cursor()

    cur.execute('select * from db_1..table_1')

    # table header
    header = tuple(col[0] for col in cur.description)
    print('\t'.join(header))
    print('-' * 60)

    res = cur.fetchall()

    for row in res:
        line = '\t'.join(str(col) for col in row)
        print(line)

    cur.close()
    conn.close()

except sybpydb.Error:
    for err in cur.connection.messages:
        print(f'Error {err[0]}, Value {err[1]}')
于 2021-01-29T21:46:32.590 回答