Sybase sybpydb查询不返回任何内容

时间:2012-12-21 00:38:52

标签: python sql sybase-ase

我目前正在使用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')

我尝试在同一个use中运行selectexecute个查询,我尝试在每个go之后包含curr.connection.commit()个命令,我尝试使用{{1}在每次之后,都没有成功。我已使用dbartisanisql确认我使用的相同查询返回条目。

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

编辑:

只是一些额外的信息。为了使sybpydb导入起作用,我不得不更改两个环境变量。我将lib路径(我添加到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)

2 个答案:

答案 0 :(得分:1)

我完全明白你可能会对文档感到困惑。它似乎与其他数据库扩展(例如psycopg2)不相上下。

连接大多数标准数据库扩展时,您可以指定数据库。然后,当您想要从SELECT查询中获取数据时,您可以使用fetch(以 ok 方式执行此操作)或迭代器(更多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

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

答案 1 :(得分: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]}')