2014-04-18 9 views
11

nazwy klawiszy dict są mapowania do attrs obiektów sqlalchemyJak zaktualizować sqlalchemy ORM obiektu przez dict Pythona

ex:

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    fullname = Column(String) 
    password = Column(String) 

mogą aktualizować z id = 3, {name: "diana"} lub id = 15, {name: "marchel", fullname: "richie marchel"}

Odpowiedz

22

można użyć setattr() aktualizować atrybuty istniejącego obiektu sqlalchemy dynamicznie:

user = session.query(User).get(someid) 

for key, value in yourdict.iteritems(): 
    setattr(user, key, value) 
+0

jest to zestaw z GET, może trochę powolny? – chao787

+1

@RichardWong: ORM musi co najmniej sprawdzić, czy wpis istnieje i dać obiektowi szansę zakłócenia danych (mogą to być właściwości hybrydowe itp.). Można oczywiście utworzyć własną instrukcję 'UPDATE' z rdzeniem SQLAlchemy. –

+2

@RichardWong: ale weź pod uwagę, że sesja jest dość zaawansowana w buforowaniu i śledzeniu aktualizacji. Jeśli zdecydujesz się ominąć, musisz również unieważnić pamięć podręczną sesji. –

2

baza na odpowiedź od @ Martijn-Pieters, można nie tylko dynamiczne kolumny aktualizacja z setattr, ale także może wykorzystać dynamiczny stół i kolumnę połączyć z getattr i setattr

przykład:

# models.py 
class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    fullname = Column(String) 
    password = Column(String) 

# update.py 
import models 

def dynamic_update(dynamic_table, col_id, dynamic_cols): 
    """ 
    dynamic_table: name of the table, "User" for example 
    col_id: id of which column you want to update 
    dynamic_cols: key value pairs {name: "diana"} 
    """ 
    if hasattr(models, dynamic_table): 
     table = getattr(models, dynamic_table) 
     col_info = table.query.filter_by(id=col_id).first() 
     for (key, value) in dynamic_cols.items(): 
      if hasattr(table, key): 
       setattr(col_info, key, value) 
       session.commit() 

BTW , można uzyskać więcej informacji na temat setattr, getattr, hasattr z pytona offical doc https://docs.python.org/2/library/functions.html#setattr

https://docs.python.org/2/library/functions.html#getattr

https://docs.python.org/2/library/functions.html#hasattr

+0

nie wygląda na zbyt pomocne, ale już odpowiedział na pytanie, może powinieneś wyjaśnić, dlaczego jest konieczne, abyś zrobił – Gahan

+0

@Gahan i przeszukałem sieć, "jak dynamicznie aktualizować tabelę i kolumnę sqlalchemy", ale nie znalazłem dobrego rozwiązania iz tego wiem, jak zaktualizować dynamiczną kolumnę i używając powyższej metody, możemy łatwiej zaktualizować tabelę sqlalchemy, nie tylko dynamiczną kolumnę, ale także dynamiczną tabelę. – vinian

+0

to miłe wyjaśnienie, proszę dodaj to do swojej odpowiedzi – Gahan

Powiązane problemy