首页 > 解决方案 > Python 'for loop' 不会导出所有记录

问题描述

我有一个执行 Oracle 存储过程的 Python 程序。SP 创建一个临时表,然后 Python 程序查询该表并将数据写入带有格式的 XML 文件。

原谅菜鸟问题,但由于某种原因,我用来导出到 XML 文件的 for 循环不会导出所有记录。如果我将创建 XML 的查询限制为 15 行,它将起作用并创建文件。对于任何高于 15 的值,程序都会完成,但不会创建文件。

然而,这并不总是一致的。如果我多次运行 15、16 或 17 行,我会得到一个文件。但是如果我尝试 20,则不会创建任何文件。没有错误,只是没有文件。

这是最初的代码。'sql' 针对 Oracle 私有临时表运行并格式化 XML:

cursor.execute(sql)
rows = cursor.fetchall()

with open(filename, 'a') as f:
 f.write('<ROWSET>')
 for row in rows:
  f.write(" ".join(row))
f.write('</ROWSET>')

cursor.close()

然后我把它改成了这个,但同样,没有创建文件:

cursor.execute(sql)

with open(filename, 'a') as f:
 f.write('<ROWSET>')
 while True:
  rows = cursor.fechmany(15)
 for row in rows:
  f.write(" ".join(row))
 f.write('</ROWSET>')

cursor.close()

我已经运行了“免费”命令并与我的 DBA 一起查看了它,它似乎不是内存问题。输出表的典型大小约为 600 行。该表本身有 36 列。

缩进可能看起来不像我在这里粘贴的那样,但程序确实有效。我只需要一种导出所有行的方法。任何见解将不胜感激。

我在使用 Python 3.8.5 的 Linux 机器上。

这是针对 cursor.execute(sql) 中的临时表执行的查询(减去专有信息):

SELECT XMLELEMENT("ROW",
                XMLFOREST(
                carrier_cd,
                prscrbr_full_name,
                prscrbr_first_name,
                prscrbr_last_name,
                d_phys_mstr_id,
                prscrbr_id,
                prscrbr_addr_line_1,
                prscrbr_addr_line_2,
                prscrbr_city,
                prscrbr_state_cd,
                prscrbr_zip,
                specialty_cd_1,
                specialty,
                unique_patient_reviewed,
                patient_count_db_oral,
                patient_count_cv_aa,
                patient_count_cv_lipo,
                PDC_DIABETES,
                PDC_HTN,
                PDC_STATINS,
                Rating_Diabetes,
                Rating_HTN,
                Rating_Statins,
                PDC_DIABETES,
                PDC_HTN,
                PDC_STATINS,
                M_PC_DB_ORAL,
                M_PC_CV_AA,
                M_PC_CV_LIPO,
                M_PDC_DIABETES,
                M_PDC_HTN,
                M_PDC_STATINS
                ),
                XMLAGG
                                                (
                XMLFOREST(
                        case when carrier_hq_cd is not null
                        then XMLConcat(
                                XMLELEMENT("PATIENT_ID", patient_id),
                                XMLELEMENT("PATIENT_NAME", patient_name),
                                XMLELEMENT("DOB", dob),
                                XMLELEMENT("PHONE_NO", phone_no),
                                XMLELEMENT("MEMBER_PDC_DIABETES", MEMBER_PDC_DIABETES),
                                XMLELEMENT("MEMBER_PDC_HTN", MEMBER_PDC_HTN),
                                XMLELEMENT("MEMBER_PDC_STATINS", MEMBER_PDC_STATINS)
                                        )
                        end "PATIENT_INFO"
                                    )
                                ORDER BY patient_id
                                )
                            )XMLOUT
 FROM ORA$PTT_QCARD_TEMP
 GROUP BY
           carrier_cd,
           prscrbr_full_name,
           prscrbr_first_name,
           prscrbr_last_name,
           d_phys_mstr_id,
           prscrbr_id,
           prscrbr_addr_line_1,
           prscrbr_addr_line_2,
           prscrbr_city,
           prscrbr_state_cd,
           prscrbr_zip,
           specialty_cd_1,
           specialty,
           unique_patient_reviewed,
           patient_count_db_oral,
           patient_count_cv_aa,
           patient_count_cv_lipo,
           PDC_Diabetes,
           PDC_HTN,
           PDC_Statins,
           Rating_Diabetes,
           Rating_HTN,
           Rating_Statins,
           M_PC_DB_ORAL,
           M_PC_CV_AA,
           M_PC_CV_LIPO,
           M_PDC_DIABETES,
           M_PDC_HTN,
           M_PDC_STATINS

标签: python-3.xoracle

解决方案


如果可以的话,我会给@Axe319 信用,因为他认为这是一个数据库问题是正确的。出于某种原因,Python 不喜欢那个长的 XML 查询,所以我将它合并到存储过程中。然后,Python 是这样的:

  # SQL query for XML data.
  sql_out = """select * from DATA_OUT"""
  cursor.execute(sql_out)
  columns = [i[0] for i in cursor.description]
  allRows = cursor.fetchall()

  # Open the file for writing and write the first row.
  xmlFile = open(filename, 'w')
  xmlFile.write('<ROWSET>')

  # Loop through the allRows data set and write it to the file.
  for rows in allRows:
       columnNumber = 0
       for column in columns:
              data = rows[columnNumber]
              if data == None:
                     data = ''
              xmlFile.write('%s' % (data))
              columnNumber += 1

  # Write the final row and close the file.
  xmlFile.write('</ROWSET>')
  xmlFile.close()

推荐阅读