2017-02-08 16 views
1

У меня есть некоторые данные, я хочу, чтобы вставить в таблицу в Netezza:питона datetime.date не соответствует Дате SQL

import pyodbc 
data=[['GZ', datetime.date(2017, 2, 8), 19.7, 10.7, 0, '1级'], 
     ['GZ', datetime.date(2017, 2, 9), 16.3, 9.7, -1, '微风'], 
     ['GZ', datetime.date(2017, 2, 10), 16.0, 10.0, -1, '微风']] 
conn = pyodbc.connect("DRIVER={NetezzaSQL}; SERVER=**;DATABASE=weather; UID=**; PASSWORD=**;") 
cur = conn.cursor() 
for i in data: 
    cur.execute(""" 
     insert into WEATHER_INFO(location,weather_date,high_tempature,low_tempature,weather,wind) 
     values(\'%s\',%s,%s,%s,%s,\'%s\') 
     """ % (i[0], i[1], i[2], i[3], i[4], i[5])) 
    conn.commit() 
cur.execute('select * from WEATHER_INFO') 
print(cur.fetchall()) 
cur.close() 
conn.close() 

Я получаю некоторую ошибку:

pyodbc.Error: ('HY000', "[HY000] ERROR: Attribute 'WEATHER_DATE' is of type 'DATE' 
but expression is of type 'INT4'\n\tYou will need to rewrite or cast the expression (46) 
(SQLExecDirectW)") 

это структура таблицы:

create table weather(
location varchar(20), 
weather_date date, 
high_tempature float(4,1), 
low_temputare float(4,1), 
weather int(11), 
wind varchar(20) 
); 

Я знаю, что python datime.date должен соответствовать дате SQL. Я не получаю ответ, который хочу получить через поиск stackoverflow. Итак, как я должен решить этот вопрос?

ответ

1

Ваша проблема заключается в том, что вы используете оператор форматирования строк % для создания динамического SQL и эти SQL-инструкции являются неверными. Если распечатать фактические утверждения, которые вы пытаетесь выполнить, они выглядят как

insert into WEATHER_INFO(location,weather_date,high_tempature,low_tempature,weather,wind) 
values('GZ',2017-02-08,19.7,10.7,0,'1级') 

Обратите внимание, что значение даты вставляется в 2017-02-08 без разделителей, так что интерпретируется как выражение целого.

Что вам нужно сделать, это использовать правильный параметризованный запрос:

sql = """\ 
insert into WEATHER_INFO(location,weather_date,high_tempature,low_tempature,weather,wind) 
values(?,?,?,?,?,?) 
""" 
for i in data: 
    cur.execute(sql, i) 
    conn.commit() 

или, возможно, просто

sql = """\ 
insert into WEATHER_INFO(location,weather_date,high_tempature,low_tempature,weather,wind) 
values(?,?,?,?,?,?) 
""" 
cur.executemany(sql, data) 
conn.commit()