2017-02-19 7 views
1

Я пытаюсь выполнить это обновление запроса из столбцов в панд dataframe:как обновить несколько строк в доступе мс от панды dataframe

sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
    df['portabilidad'], df['contrato'], df['estado'] 
) 

cursor.execute(sql) 

Запрос не выполняется и не отображается ошибка.

Мой dataframe выглядит следующим образом:

Data Table Screeshot

ответ

1

К сожалению, MS Access (в частности, ее диск уровня Jet/ACE Двигатель не программа GUI .exe) не поддерживается с помощью SQLAlchemy, чтобы разрешить метод pandas.to_sql(), который в идеале вы можете подтолкнуть вашу фреймворк к временной таблице в базе данных, чтобы запустить запрос UPDATE final INNER JOIN temp ... для обновления финальной таблицы, гораздо более быстрый маршрут чем повторение строк.

К счастью, MS Access 'Jet/ACE Engine может запрашивать файлы csv, как если бы они были таблицами, где вы указываете путь к файлу, а затем имя файла csv. Следовательно, рассмотрите возможность экспорта dataframe to_csv, затем создайте временную таблицу с помощью запроса Make-Table и, наконец, запустите запрос соединения обновления. Ниже try/except используется для удаления таблицы, если существует (поскольку команда IF EXISTS недоступна в MS Access SQL).

df.to_csv('C:\Path\To\CSV\Output.csv', index=False) 

try: 
    cursor.execute("SELECT * INTO tblhis_ventas_Temp" +\ 
        " FROM [text;HDR=Yes;FMT=Delimited(,);Database=C:\Path\To\CSV].Output.csv") 
    conn.commit() 

    cursor.execute("UPDATE tblhis_ventas f INNER JOIN tblhis_ventas_Temp t" + \ 
        " ON f.contrato = t.contrato AND f.estado = t.estado" + \ 
        " SET f. portabilidad = t.portabilidad") 
    conn.commit() 

except Exception as e:  
    if 'already exists' in str(e): 
     cursor.execute("DROP TABLE tblhis_ventas_Temp") 
     conn.commit() 
    else: 
     print(e) 

cursor.close() 
conn.close() 

И нет, мы не можем напрямую использовать CSV-файл в UPDATE запросе (обходя температуру процесса таблицы), как CSV является только для чтения и не обновляемые записей. Интересно, что вы можете использовать CSV в INSERT...SELECT.

+0

это работает !. Это очень быстро. Я не знал временные файлы csv в доступе ms. Я очень благодарен всем вам. – calobeto

0

итерацию строк и обновлять один на один:

sql = 'UPDATE tblhis_ventas SET portabilidad = ? WHERE contrato = ? and estado = ?' 
for index, row in df.iterrows(): 
    cursor.execute(sql, [row['portabilidad'], row['contrato'], row['estado']]) 
+0

это работает !. Проблема в том, что таблица более 10 тыс., И для обновления одного поля требуется более 10 минут, мне нужно еще 10 полей;). Есть ли быстрый способ? – calobeto

+0

@calobeto, Не могли бы вы показать весь код? Не зная, какие данные выбраны и какая операция выполняется с помощью 'df', я не могу сказать вам, как ее улучшить, или даже рассказать вам, возможно ли это. – falsetru

 Смежные вопросы

  • Нет связанных вопросов^_^