如何操纵cx_Oracle的查询结果

时间:2017-08-08 20:47:09

标签: 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()

返回:

[]
[]
[]

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

E
X
A
M
P
L
E

当我只是期待:

Example

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

2 个答案:

答案 0 :(得分:4)

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

<强> 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)

  

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

我不完全明白你究竟是什么意思,但是:

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

现在,如果你得到像

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

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

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])

# ...

请注意,即使您只选择一列,光标结果也始终为数据库行

答案 1 :(得分:1)

如果您尝试从某个工具(如DB visualizer)运行sql select语句,您的结果会是什么样的?这只会证实你的sql语句没有任何问题。

在我使用cx_Oracle的项目中,我有一个用于查询我的oracle db的函数,如下所示。您可以将sql statment作为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()

此函数返回查询结果的列表。如果您选择的不仅仅是一列,它将作为元组列表返回[('value','other'),('another','row'),('some','more'),('等','等')]

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

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

然后变量结果应该是您的结果列表,然后您可以使用该列表执行任何操作。希望这会有所帮助