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

Joj*_*oji 4 python oracle cx-oracle

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

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()
Run Code Online (Sandbox Code Playgroud)

返回:

[]
[]
[]
Run Code Online (Sandbox Code Playgroud)

当我将结果放入列表并返回一个索引时,就像results[0]他们只打印结果的第一个字母一样:

E
X
A
M
P
L
E
Run Code Online (Sandbox Code Playgroud)

当我只是期待:

Example
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*raf 5

您的代码有几个不同的问题。

1)

list.append
Run Code Online (Sandbox Code Playgroud)

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

 list.append(result)
Run Code Online (Sandbox Code Playgroud)

会做你所期望的 - 它附加result到名为list.

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

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

2)

    print (list)
Run Code Online (Sandbox Code Playgroud)

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

您可能希望通过减少它的缩进(将它向左移动 4 个空格)将它移到循环之外- 然后列表的内容将只在循环结束时打印一次。

3)

当我将结果放入一个列表并返回一个索引时,就像results[0]他们只打印结果的第一个字母一样 [...]

我不完全理解你的意思,但是:

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

现在,如果你得到这样的结果

E
X
A
M
P
L
E
Run Code Online (Sandbox Code Playgroud)

在 Python 中,这意味着您以某种方式处理了一个真正是字符串的对象,这表明您假设它是一个列表(或某种其他类型的序列)。例如,如果

for item in results:
    print(item)
Run Code Online (Sandbox Code Playgroud)

或者

for i in range(len(results)):
    print(results[0])
Run Code Online (Sandbox Code Playgroud)

导致这种行为,那么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])

# ...
Run Code Online (Sandbox Code Playgroud)

但请注意,游标结果始终是数据库行- 即使您只选择一列。