如何操纵来自 cx_Oracle 的查询结果

How manipulate query results from cx_Oracle

我正在尝试创建一个包含列结果的列表。我执行了查询,结果没问题,但是当我使用 list.append 在列表中输入数据时,它们 return 只是 [].

import cx_Oracle
con = cx_Oracle.connect('user/psw@localhost')

cur = con.cursor()
list = []

cur.execute('select column from table')
for result in cur.fetchall():
    list.append
    print (list)

cur.close()
con.close()

Return:

[]
[]
[]

当我将结果放入列表和 return 索引时,例如 results[0] 他们只打印结果的第一个字母,例如:

E
X
A
M
P
L
E

当我刚刚期待:

Example

我的代码有问题吗?最好的问候,社区!

如果您尝试 运行 sql select 某些工具(如 DB 可视化工具)的语句,您的结果是什么样的?这只会确认您的 sql 声明没有任何问题。

在我使用 cx_Oracle 的项目中,我有一个用于查询我的 oracle 数据库的函数,如下所示。您可以将 sql 语句作为 sql 传递给函数。

def execute_query_result_set(sql, args=(), one=False):
    print "execute_query_result_set()"
    con = ""
    con = cx_Oracle.connect(_connection_string)

    try:
        cursor = con.cursor()
        cursor.execute(sql)
        results = cursor.fetchall()
        return results
    finally:
        if con != "":
            con.close()

此函数return是查询结果的列表。如果您 select 不止一列,它将 return 作为元组列表 [('value', 'other'), ('another', 'row'), ('some', 'more'), ('etc', 'etc')]

如果不想调用单独的函数,您可以直接执行

con = cx_Oracle.connect(your_db_connection_string)
cursor = con.cursor()
cursor.execute(your_sql_select_statement)
results = cursor.fetchall()
con.close()

然后变量 results 应该是你的结果列表,然后你可以用这个列表做任何你需要的事情。希望这会有所帮助

您的代码存在几个不同的问题。

1)

list.append

附加什么? append 是列表对象的方法,您需要使用 参数 来调用它。在你的情况下,

 list.append(result)

会按照您的预期进行 - 它将 result 附加到名为 list.

的列表中

注意:这不会产生错误的原因是你甚至没有调用 append 函数,你只是引用它。 在 Python 中,指令只是一个表达式是合法的 - 当 运行 作为脚本时,该表达式的结果将被静默丢弃(与交互式解释器相反,其中表达式的结果将自动为您打印)。

因此,例如在脚本中的一行中使用 42 == 7 是完全合法的。它不会做任何事情(该表达式的结果 False 将被静默丢弃),但它也不会导致错误。

2)

    print (list)

您在循环内执行此操作,这意味着循环的每次迭代将执行一次 - 在您的示例中执行 3 次,因为显然 select column from table给出三个结果。上面的数字 1) 是你得到一个空列表的原因 ([]),这就是你三次得到空列表的原因 ([] [] [])。

您可能希望通过减少缩进(向左移动 4 个空格)将此 移出 循环 - 这样列表的内容将只打印一次,在循环结束时。

3)

When I put the results in to a list and return an index, like results[0] they just print the first letter of the results like [...]

我不完全明白你的意思,但是:

在Python中,字符串和列表一样,也是序列(字符串是字符的序列)。这意味着某些操作可以在两者上完成,例如索引(sequence[index] 语法)或循环它们(for item in sequence)。

现在,如果你得到像

这样的结果
E
X
A
M
P
L
E

在 Python 中,这意味着您处理的对象实际上是 字符串 ,这表明您假设它是 list(或其他某种序列)。例如,如果

for item in results:
    print(item)

for i in range(len(results)):
    print(results[0])

导致这种行为,那么results实际上是一个字符串,而不是你期望的列表。


总而言之,您可能想要这样的东西:

# ...

results = []

cur.execute('select column from table')
for row in cur.fetchall():
    results.append(row)

# print the entire list
print(results) 

# print the first row by addressing it via index
print(results[0])

# print the first column of the third row
print(results[2][0])

# ...

不过请注意,游标结果始终是 数据库行 - 即使您只是 select 一列。