2015-04-13 18 views
17

PostgreSQL db'im var. Pandalar, bir veri çerçevesinin kayıtlarını bir veri tabanına yazmak için bir 'to_sql' fonksiyonuna sahiptir. Ancak, veri tabanı ile işiniz bittiğinde pandaları kullanarak varolan bir veritabanı sırasının nasıl güncelleneceği konusunda herhangi bir belge bulamadım.Veritabanındaki varolan satırı pandalardan güncelle df

Şu anda bir veritabanı tablosunu pandas read_sql_table kullanarak bir veri çerçevesine okuyabiliyorum. Daha sonra gerekli verilerle çalışıyorum. Ancak, orijinal satırları güncellemek için bu veri tabanını veritabanına nasıl yazacağımı anlayamadım.

Tüm tablonun üzerine yazmak zorunda kalmak istemiyorum. Sadece orijinal olarak seçilen satırları güncellemeye ihtiyacım var.

+1

fazla araştırma I Upon: Burada

bir örnektir hala bir çözüm bulamadı. Görünüşe göre, pandalarla bir bayrak ayarlayabilirsin: to_sl (if_exists = 'append'). Ama if_exists = 'update' için bir şey yok gibi görünüyor. Bunu gerçekten tuhaf buluyorum. Bir pandalar veri tabanını bir veritabanına geri almanın ve değiştirilen satırları güncellemenin önerilen yolu nedir? Elbette bu ortak bir görevdir? – darkpool

+1

Veri alanına yeni satırlar ekliyor veya kaldırıyor musunuz? Eğer değilseniz, sanırım sorguları yapabileceğinizi biliyorsunuzdur. Ancak satır ekliyor veya kaldırıyor olsanız bile, birincil anahtarı bıraktıktan sonra, sorgularla bunu gerçekleştirmenin basit bir yolu olabilir. Biraz daha açıklama verirseniz, sadece sorguları kullanarak nispeten basit bir cevap için bir şans olduğunu düşünüyorum. – lrnzcig

+0

'to_sql' güncellemeleri desteklemiyor. Şimdiye kadar bulduğum en iyi yaklaşım, veritabanı tablosunda, bir çift ana anahtarın eklenmesi durumunda tüm alanları güncelleyen bir 'ON INSERT' tetikleyicisi oluşturmaktır. – ostrokach

cevap

4

bir yolu bir sqlalchemy "Tablo sınıfı" ve session.merge (satır), session.commit() kullanımını yapmaktır:

for row in range(0, len(df)): 
    row_data = table_class(column_1=df.ix[i]['column_name'], 
          column_2=df.ix[i]['column_name'], 
          ... 
          ) 
    session.merge(row_data) 
    session.commit()