Python数据库API v2>;如果在迭代期间执行的查询未返回任何结果,则对结果集的迭代将停止

Python数据库API v2>;如果在迭代期间执行的查询未返回任何结果,则对结果集的迭代将停止,python,python-db-api,snowflake-cloud-data-platform,Python,Python Db Api,Snowflake Cloud Data Platform,我在一个脚本中使用了(它实现了对Python数据库API v2规范的支持),该脚本从一个表中提取大量记录,迭代结果集,并针对返回的每一行查询另一个表,该表可能返回,也可能不返回任何结果 在二次查询没有返回结果的情况下,即使没有抛出错误,对第一次查询返回的结果的迭代也会停止 下面的代码演示了我遇到的问题 cur = cnx.cursor() foobars = cur.execute("SELECT * FROM foobar") for foobar in foobars:

我在一个脚本中使用了(它实现了对Python数据库API v2规范的支持),该脚本从一个表中提取大量记录,迭代结果集,并针对返回的每一行查询另一个表,该表可能返回,也可能不返回任何结果

在二次查询没有返回结果的情况下,即使没有抛出错误,对第一次查询返回的结果的迭代也会停止

下面的代码演示了我遇到的问题

cur = cnx.cursor()
foobars = cur.execute("SELECT * FROM foobar")
    for foobar in foobars:
        foobarId = foobar[0]

        # Iteration over foobars stops if no records are returned for the following 
        foobaz = cur.execute("SELECT * FROM foobaz WHERE foobarId = %s", (foobarId))
        if foobaz.rowcount != 0:
            # Iterate over foobaz here

如果抛出异常,我可以通过捕获错误并转到下一个结果来处理此场景。如果没有抛出异常,将如何处理此场景?

光标存储最后一次选择的状态。因此,您必须为并行选择创建一个新光标:

cur = cnx.cursor()
cur.execute("SELECT * FROM foobar")
for foobar in cur:
    foobarId = foobar[0]

    cur2 = cnx.cursor()
    cur2.execute("SELECT * FROM foobaz WHERE foobarId = %s", (foobarId,))
    for foobaz in cur2:
        # Iterate over foobaz here

啊!!我应该意识到。。。谢谢你的帮助,丹尼尔!