Risposte:
Il codice di esempio dovrebbe aver funzionato così com'è. SQLAlchemy dovrebbe fornire un valore per f.id
, supponendo che sia una colonna di chiave primaria a generazione automatica . Gli attributi della chiave primaria vengono popolati immediatamente all'interno del flush()
processo non appena vengono generati e non commit()
dovrebbe essere richiesta alcuna chiamata a . Quindi la risposta qui sta in uno o più dei seguenti:
Ho appena riscontrato lo stesso problema e dopo i test ho scoperto che NESSUNA di queste risposte è sufficiente.
Attualmente, o come da sqlalchemy .6+, c'è una soluzione molto semplice (non so se esiste nella versione precedente, anche se immagino che lo sia):
session.refresh ()
Quindi, il tuo codice sarebbe simile a questo:
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.
Ecco come farlo.
sessionmaker(autoflush=True)
, quella combinazione con refresh () mi ha fornito l'ID riga. #grrr
flush()
e commit()
, ecco una buona spiegazione: stackoverflow.com/a/4202016/1252290
flush()
usarlo commit()
e subito dopo - aggiorna con session.refresh(f)
, funziona per me, e io uso la versione SQLAlchemy0.6.7
Grazie a tutti. Ho risolto il mio problema modificando la mappatura delle colonne. Per me autoincrement=True
è necessario.
origine:
id = Column('ID', Integer, primary_key=True, nullable=False)
dopo la modifica:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
poi
session.flush()
print(f.id)
va bene!
a differenza della risposta data da dpb, non è necessario un aggiornamento. una volta scaricato, puoi accedere al campo id, sqlalchemy aggiorna automaticamente l'id che viene generato automaticamente nel backend
Ho riscontrato questo problema e ho capito il motivo esatto dopo alcune indagini, il mio modello è stato creato con id come integerfield e nel mio modulo l'id è stato rappresentato con hiddenfield (poiché non volevo mostrare l'id nel mio modulo). Il campo nascosto è rappresentato per impostazione predefinita come testo. una volta cambiato il modulo in integerfield con widget = hiddenInput ()) il problema è stato risolto.
Dovresti provare a usare session.save_or_update(f)
invece di session.add(f)
.
save_or_update
è stato deprecato dalla 0,5 circa. session.add()
dovrebbe farlo.
echo=True
e vedere quale SQL viene eseguito al momento dello scaricamento? Quello che descrivi dovrebbe funzionare e darti l'id, ma potrebbe esserci qualche altro problema che fa sì che f.id sia Nessuno.