python pyodbc查询循环只返回一个结果

时间:2014-02-05 18:20:41

标签: python for-loop pyodbc

我已经包含了以下代码。基本上,我有一个表(称为forumPosts),其中包含user_idchildrencontentid列。 childrenforumPosts的一系列ID,它们是后续论坛帖子(我不负责将儿童帖子组织到与父帖相同的表格中)。此字符串的格式类似于'["id1","id2",...]'

我的目标是生成一个如下所示的数据集:

parent_user_id,child_user_id_1,child_user_id_2,...

这里的问题是下面的代码只打印一个输出。为什么这样做?谢谢你的帮助。

import pyodbc


#connect to database, create db cursor
cnxn = pyodbc.connect('cnxnstring', autocommit=True)
cursor = cnxn.cursor()

for row in cursor.execute("select user_id,children from myTable where children!='[]' and user_id!='null'"):
    children=row[1].replace('"','').replace('[','').replace(']','').split(',')
    userid=row[0]
    for child in children:
        print cursor.execute("select user_id from myTable where id = ?",child).fetchone()

所请求列的示例数据:

  id           |  user_id    |  children
hgjegh4pjbr44p | gd6v7134AUa | ["asdf34dfg3sdfq", "asdegh4pjbrxx3"]
asdegh4pjbrxx3 | xzf7134AUax | ["hgjegh4pjbr44p"]
hgjegh4pjbr44p | NULL        | []
asdf34dfg3sdfq | adfcv34skax | []

2 个答案:

答案 0 :(得分:1)

说明

使用提供的样本数据,输出为:

('adfcv34skax', )
None

由于前导空格,不会返回asdegh4pjbrxx3 ID的行。通过将最后一个print行更改为:

可以观察到这种情况
print child

哪个输出:

asdf34dfg3sdfq
 asdegh4pjbrxx3
hgjegh4pjbr44p

' asdegh4pjbrxx3'不等于'asdegh4pjbrxx3',返回空结果。

解决方案

用以下内容替换children分配行以删除必要的字符和空格:

children=[child.strip('"[] ') for child in row[1].split(',')]

我认为单个strip调用的列表理解比嵌套replace更具可读性。

或者,ast.literal_eval也应该有效:

children=ast.literal_eval(row[1])

答案 1 :(得分:1)

上述答案是正确的,假设问题出在您的子女任务中。您应该在儿童圈中进行内省或打印,以查看您的列表理解是否符合您的意图。这就是关于列表理解的有趣之处:它们可以工作,但是不要做你打算做的事情,因为你的假设需要完美无缺。在这种情况下,您不会考虑连接到的数据库的所有可能输出。在您使用它时,您可能希望确保您的程序处理父数据库程序可以接受的字符集。