Odpowiedzi:
Twój przykładowy kod powinien działać tak, jak jest. SQLAlchemy powinien podać wartość dla f.id
, zakładając, że jest to automatycznie generująca się kolumna klucza podstawowego. Atrybuty klucza podstawowego są wypełniane natychmiast w flush()
procesie w trakcie ich generowania i nie commit()
powinno być wymagane żadne wywołanie . Tak więc odpowiedź tutaj leży w jednym lub kilku z poniższych:
Właśnie natknąłem się na ten sam problem i po przetestowaniu stwierdziłem, że ŻADNA z tych odpowiedzi nie jest wystarczająca.
Obecnie, lub od sqlalchemy .6+, istnieje bardzo proste rozwiązanie (nie wiem, czy istnieje w poprzedniej wersji, chociaż wyobrażam sobie, że tak jest):
session.refresh ()
Twój kod wyglądałby więc mniej więcej tak:
f = Foo(bar=x)
session.add(f)
session.flush()
# At this point, the object f has been pushed to the DB,
# and has been automatically assigned a unique primary key id
f.id
# is None
session.refresh(f)
# refresh updates given object in the session with its state in the DB
# (and can also only refresh certain attributes - search for documentation)
f.id
# is the automatically assigned primary key ID given in the database.
Tak to się robi.
sessionmaker(autoflush=True)
, że combo w / refresh () dostarczyło mi identyfikator wiersza. #grrr
flush()
i commit()
, oto dobre wyjaśnienie: stackoverflow.com/a/4202016/1252290
flush()
używać commit()
i zaraz potem - odśwież go session.refresh(f)
, działa dla mnie i używam wersji SQLAlchemy0.6.7
Dziękuję wszystkim. Rozwiązałem swój problem, modyfikując mapowanie kolumn. Dla mnie,autoincrement=True
jest to wymagane.
pochodzenie:
id = Column('ID', Integer, primary_key=True, nullable=False)
po modyfikacji:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
następnie
session.flush()
print(f.id)
jest ok!
w przeciwieństwie do odpowiedzi udzielonej przez dpb, odświeżanie nie jest konieczne. po opróżnieniu możesz uzyskać dostęp do pola id, sqlalchemy automatycznie odświeża identyfikator, który jest automatycznie generowany na zapleczu
Napotkałem ten problem i po pewnym dochodzeniu ustaliłem dokładną przyczynę, mój model został utworzony z id jako całkowitym polem, aw mojej postaci identyfikator był reprezentowany przez ukryte pole (ponieważ nie chciałem pokazywać id w moim formularzu). Ukryte pole jest domyślnie reprezentowane jako tekst. gdy zmieniłem formularz na integerfield z widget = hiddenInput ()) problem został rozwiązany.
Powinieneś spróbować użyć session.save_or_update(f)
zamiast session.add(f)
.
save_or_update
jest przestarzały od około 0,5 roku. session.add()
powinien to zrobić.
echo=True
i zobaczyć, jaki kod SQL jest wykonywany w czasie usuwania? To, co opisujesz, powinno zadziałać i podać identyfikator, ale może jest jakiś inny problem, który powoduje, że f.id ma wartość Brak.