Chcę zrobić coś takiego:
f = Foo(bar='x')
session.add(f)
session.flush()
# do additional queries using f.id before commit()
print f.id # should be not None
session.commit()
Ale f.id
jest None
, gdy próbuję go. Jak to działa?
python
sqlalchemy
Eloff
źródło
źródło
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.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 wflush()
procesie w trakcie ich generowania i niecommit()
powinno być wymagane żadne wywołanie . Tak więc odpowiedź tutaj leży w jednym lub kilku z poniższych:źródło
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:
Tak to się robi.
źródło
sessionmaker(autoflush=True)
, że combo w / refresh () dostarczyło mi identyfikator wiersza. #grrrflush()
icommit()
, oto dobre wyjaśnienie: stackoverflow.com/a/4202016/1252290flush()
używaćcommit()
i zaraz potem - odśwież gosession.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:
po modyfikacji:
następnie
jest ok!
źródło
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.
źródło
Kiedyś miałem problem z przypisaniem
0
do id przed wywołaniemsession.add
metody. Identyfikator został poprawnie przypisany przez bazę danych, ale poprawny identyfikator nie został pobrany z sesji posession.flush()
.źródło
Powinieneś spróbować użyć
session.save_or_update(f)
zamiastsession.add(f)
.źródło
save_or_update
jest przestarzały od około 0,5 roku.session.add()
powinien to zrobić.