2015-09-23 4 views
0

Я пытаюсь вставить словарь в таблицу Oracle и его отказ от ошибки несоответствия данных. Я хочу знать, является ли синтаксис, который я использую, правильным.python oracle insert datatype mismatch

In [19]:selrow 
Out[19]:[{'CUSTOMER_NM': 'ABC INC', 
    'CUSTOMER_NO': 'A0050129', 
    'CUSTOMER_SK': 926, 
    'EFFECTIVE_DT': datetime.datetime(2015, 10, 2, 0, 0)}] 

Вот моя вставка заявление:

In [30]:cur=db.cursor() 
cur.execute('INSERT INTO DIM_CUST (%s) VALUES (%s)', (selrow[0].keys(),    selrow[0].values())) 
db.commit() 

, и я получаю следующее сообщение об ошибке:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-30-eefac6fb0aa7> in <module>() 
     2 #query = 'INSERT INTO DIM_CUST (%s) VALUES (%s)', (selrow[0].keys(), selrow[0].values()) 
     3 #rint query 
----> 4 cur.execute('INSERT INTO DIM_CUST (%s) VALUES (%s)', (selrow[0].keys(), selrow[0].values())) 
     5 db.commit() 

TypeError: expecting numeric data 

Является ли мой синтаксис вставки правильно? Я использую словарные ключи как имена столбцов и словарные значения как значения, которые нужно ввести в таблицу.

pl. спросите любые детали, которые я, возможно, пропустил. Спасибо за любую помощь, которую вы можете предоставить.

+0

Невозможно проверить это прямо сейчас, так что просто комментарий вместо ответа: что-то в строках 'cur.execute ('INSERT INTO DIM_CUST (CUSTOMER_NO, CUSTOMER_NM, CUSTOMER_SK, EFFECTIVE_DT) VALUES (: CUSTOMER_NO,: CUSTOMER_NM,: CUSTOMER_SK,: EFFECTIVE_DT) ', selrow [0]) 'должен работать. См. Документы ['paramstyle'] (https://www.python.org/dev/peps/pep-0249/#paramstyle) для вашего адаптера DBAPI Oracle для поддерживаемых стилей параметров. –

+0

Спасибо, Лукас, работал как шарм. Я переписал его, чтобы сделать его несколько общим. См. Ниже мой ответ. Еще раз спасибо. –

ответ

1

Thank you Lucas & haraprasadj. Основываясь на ваших указателях, я придумал следующее:

cols = ', '.join(selrow[0].keys()) 
vals = ':'+', :'.join(selrow[0].keys()) 
sql='INSERT INTO DIM_CUST (%s) VALUES (%s)' % (cols, vals) 
cur.execute(sql, selrow[0]) 
db.commit() 

Это работает! приложите свою помощь.