我可以绕过TypeError来执行我的命令吗?

时间:2017-03-07 15:52:14

标签: python sql oracle pandas typeerror

我正在尝试将Dataframe导出到Oracle表并继续运行错误

TypeError: expecting string or bytes object

我希望能够忽略或绕过此错误,以便导出我拥有的内容。那可能吗?

以下是我详细解释问题所在的链接:Python - TypeError: expecting string or bytes object。我的数据显然是完美的,它始终是正确的列和行数,它们都是相同的数据类型,我使用这种精确的方法之前导出数百个其他Dataframes,我想绕过错误消息,以便导出我到目前为止。

另外,因为它在cursor.executemany(行失败,所以我决定研究这个命令。以下是cx_Oracle的文档:http://cx-oracle.readthedocs.io/en/latest/cursor.html。它声明:

When true, the batcherrors parameter enables batch error support within Oracle and ensures that the call succeeds even if an exception takes place in one or more of the sequence of parameters.

所以我将它设置为true cursor.executemany(sql_query, exported_data, batcherrors=True)并且它什么都没改变。

以下是我的相关代码:

df = pd.read_excel(file_path)


df = df.fillna(0)
df = df.ix[1:]


cursor = con.cursor()
exported_data = [tuple(x) for x in df.values]
#exported_data = [str(x) for x in df.values]
#print("exported_data:", exported_data)

sql_query = ("INSERT INTO FISHTABLE(date_posted, stock_id, species, pounds, advertised_price, email_year, email_month, email_day, sector_name, ask)" "VALUES(:1, :2, :3, :4, :5, :6, :7, :8, 'Sustainable Harvest Sector', '1')")

cursor.executemany(sql_query, exported_data)

con.commit() #commit to database

cursor.close()
con.close()

这是exported_data的打印输出:

[('DATE', 'TRADE ID', 'AVAILABLE STOCK', 'AMOUNT', 'BUY PRICE', '2013', '4', '16'), ('04/02/13', 130014, 'WINTER SNE', 12000, 'TRADE IN RETURN FOR', '2013', '4', '16'), (0, 0, 0, 0, 'HADDOCK GOM,', '2013', '4', '16'), (0, 0, 0, 0, 'YELLOWTAIL GOM, OR', '2013', '4', '16'), (0, 0, 0, 0, 'WITCH - OFFERS', '2013', '4', '16'), ('FY13 QUOTA – TO BUY', 0, 0, 0, 0, '2013', '4', '16'), ('DATE', 'TRADE ID', 'DESIRED STOCK', 'AMOUNT', 'BUY PRICE', '2013', '4', '16'), ('3/26/13', 130006, 'COD GBE', 'ANY', 'OFFERS', '2013', '4', '16'), ('4/9/13', 130012, 'COD GBW', 'UP TO 100,000', 0.3, '2013', '4', '16'), ('3/26/13', 130007, 'COD GBW', 'ANY', 'OFFERS', '2013', '4', '16'), ('3/26/13', 130001, 'COD GOM', 'INQUIRE', 1.5, '2013', '4', '16'), ('3/26/13', 130009, 'WINTER GB', 'ANY', 'OFFERS', '2013', '4', '16'), ('4/9/13', 130013, 'WINTER SNE', 'UP TO 100,000', 0.3, '2013', '4', '16'), ('3/26/13', 130010, 'WINTER SNE', 'ANY', 'OFFERS', '2013', '4', '16'), ('3/26/13', 130008, 'YELLOWTAIL GB', 'ANY', 'OFFERS', '2013', '4', '16'), ('3/26/13', 130011, 'YELLOWTAIL GOM', 'ANY', 'TRADE FOR GB STOCKS -\nOFFERS', '2013', '4', '16'), (1, 0, 0, 0, 0, '2013', '4', '16')]

我真的很想帮助解决这个问题,因为我已经坚持了一个多星期了。感谢。

1 个答案:

答案 0 :(得分:2)

Error or exception handling in Python is done by using try-except blocks

try:
    cursor.executemany(sql_query, exported_data)
except TypeError:
    pass # put your error handling code here, pass will ignore the error

您要为错误处理做些什么取决于您。默认的Python行为是raise错误(因此你看到它)。当遇到错误时,执行停止,并执行您定义的错误处理例程。忽略错误将使方法cursor.executemany从中断处继续,而只是不处理错误。你可以在那里再次调用该方法(使用相同的参数),但这显然无济于事,因为它只会再次产生相同的错误。