cx-oracle-executemany()-пакет-вставка-ожидаемая ошибка-номер

#python #oracle #cx-oracle #executemany

Вопрос:

У меня есть список

bind_insert:

     [(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()

Мой Код:

 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:AlokCR06645_PythonCodeinsertdf.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:AlokCR06645_PythonCodeCR6645script.py", line 1073, in CollateralValidation
    bVal=insertdf.InsertIntoDB(FinalDataframe,fileCSVName)
  File "D:AlokCR06645_PythonCodeCR6645script.py", line 34, in readCSV
    abc=CollateralValidation(dfFileNames)
 

Ответ №1:

Вы можете предпочесть использовать

  • date тип datetime модуля вместо TO_DATE преобразования уровня БД
  • Параметризованная строка запроса, а не объединенная(в основном она безопаснее)
  • Цикл для динамического получения 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)