我尝试使用列中的结果创建列表。我执行查询并且结果没问题,但是当我使用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
我的代码有问题吗?最诚挚的问候,社区!
答案 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()
然后变量结果应该是您的结果列表,然后您可以使用该列表执行任何操作。希望这会有所帮助