【问题标题】:cx-oracle-executemany()-batch-insert-error-expecting-numbercx-oracle-executemany()-batch-insert-error-expecting-number
【发布时间】:2021-11-26 00:27:48
【问题描述】:

我有一个清单

绑定插入:

    [(3, 18, '01-10-2021', 'M51078', 'AABCM5192K', '01280', 'AABCM5192K', None, None, 'X95091', 'AZEPK0300N', 
'C', 'CO', 'N01477', 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 'N', 
'N', 'Y', '05-10-2021', 'SYSTEM', None, None), (4, 18, '01-10-2021', 'M51078', 'AABCM5192K', '01280', 'AABCM5192K', None, None, 'LP1059', 'ASCPC7149Q', 'C', 'CO', 'TEST2', 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 
123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 123000000.0, 'N', 'N', 'Y', '05-10-2021', 'SYSTEM', None, None), (5, 18, '01-10-2021', None, 'AABCM5192K', None, None, 'ILFSLOU01', 'AAACL7361E', None, 'AAACG7034K', 'C', 'CO', 'N01582', 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 'N', 'N', 'Y', '05-10-2021', 'SYSTEM', None, None), (6, 18, '01-10-2021', None, 'AABCM5192K', None, None, 'ILFSSHA01', 'AABCS3644N', None, 'ADPPA5335E', 'C', 'CO', 'N01490', 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 'N', 'N', 'Y', '05-10-2021', 'SYSTEM', None, None)]

当列表仅包含一个元组时,它成功插入到数据库中我尝试使用 bind_insert 中的所有单个元组,但是当所有 3 个元组都存在时,它在 executemany() 中给出 Expecting number 错误

我的代码:

for b in bind_insert :
for index, value in enumerate(b):
        if isinstance(value, float) and math.isnan(value):
            b[index] = None
        elif isinstance(value, type(pd.NaT)):
            b[index] = None
print("before")
                       
                  
start_time = time.time()                  
                                                     
                                
cursor.setinputsizes(None, 25)
                                                                                                                                                                                                                                                                                                                                                                                                                             
cursor.executemany("insert into "+config.NcsOwner+".COLL_CLIENT_SUBMISSION_DTLS values (:1,:2,to_date(:3,'DD-MM-YYYY'),:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31,:32,:33,:34,:35,:36,:37,:38,:39,:40,:41,:42,:43,:44,:45,:46,:47,:48,:49,:50,:51,:52,:53,:54,:55,:56,:57,:58,:59,to_date(:60,'DD-MM-YYYY'),:61,to_date(:62,'DD-MM-YYYY'),:63)", bind_insert)
                                     
                                                                 
connection.commit()

错误:

    Exception has occurred: TypeError
expecting number
  File "D:\Alok\CR06645_PythonCode\insertdf.py", line 42, in InsertIntoDB
    cursor.executemany("insert into "+config.NcsOwner+".COLL_CLIENT_SUBMISSION_DTLS values (:1,:2,to_date(:3,'DD-MM-YYYY'),:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31,:32,:33,:34,:35,:36,:37,:38,:39,:40,:41,:42,:43,:44,:45,:46,:47,:48,:49,:50,:51,:52,:53,:54,:55,:56,:57,:58,:59,to_date(:60,'DD-MM-YYYY'),:61,to_date(:62,'DD-MM-YYYY'),:63)", bind_insert)
  File "D:\Alok\CR06645_PythonCode\CR6645script.py", line 1073, in CollateralValidation
    bVal=insertdf.InsertIntoDB(FinalDataframe,fileCSVName)
  File "D:\Alok\CR06645_PythonCode\CR6645script.py", line 34, in readCSV
    abc=CollateralValidation(dfFileNames)

【问题讨论】:

    标签: python oracle cx-oracle executemany


    【解决方案1】:

    你可以更喜欢使用

    • date 类型的datetime 模块而不是TO_DATE DB 层的转换
    • 参数化查询字符串,而不是串联一个(主要是更安全
    • 一个循环以动态获取bind_insert 列表(:1, :2, :3, ... :63),而不是通过使用元组的第一个元素(bind_insert[0]) 显式编写它们

    比如

     bind_insert=[    
                 (3,18,'TEST1',datetime.date(2021,10,1),'M51078'...),
                 (4,18,'TEST2',datetime.date(2021,10,1),'M51078'...),
                 .....
     ]
     
     val=""
     j=0
     for i in bind_insert[0]:
         j+=1
         val+=':'.join(' '+str(j)) + ','
         values=val.rstrip(",")
         
     table = config.NcsOwner+".coll_client_submission_dtls"
         
     my_query = f"INSERT INTO {table} VALUES({values})"
     
     cursor.executemany(my_query,bind_insert)
    

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 2014-09-19
      • 2018-12-16
      • 2021-09-21
      • 1970-01-01
      • 2016-05-15
      • 2022-12-27
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多