Respuestas:
Su código de muestra debería haber funcionado como está. SQLAlchemy debería proporcionar un valor para f.id
, asumiendo que es una columna de clave primaria que se genera automáticamente. Los atributos de clave primaria se completan inmediatamente dentro del flush()
proceso a medida que se generan, y no se commit()
debe requerir ninguna llamada a . Entonces, la respuesta aquí radica en uno o más de los siguientes:
Acabo de encontrarme con el mismo problema y, después de probar, descubrí que NINGUNA de estas respuestas es suficiente.
Actualmente, o a partir de sqlalchemy .6+, hay una solución muy simple (no sé si existe en la versión anterior, aunque imagino que sí):
session.refresh ()
Entonces, su código se vería así:
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.
Así es como se hace.
sessionmaker(autoflush=True)
, ese combo w / refresh () me proporcionó el ID de fila. #grrr
flush()
y commit()
, aquí hay una buena explicación: stackoverflow.com/a/4202016/1252290
flush()
usar commit()
y justo después de eso, actualícelo con session.refresh(f)
, funciona para mí y uso la versión SQLAlchemy0.6.7
Gracias a todos. Resolví mi problema modificando el mapeo de columnas. Para mí, autoincrement=True
es obligatorio.
origen:
id = Column('ID', Integer, primary_key=True, nullable=False)
después de modificado:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
luego
session.flush()
print(f.id)
esta bien!
a diferencia de la respuesta dada por dpb, no es necesaria una actualización. una vez que se descarga, puede acceder al campo de identificación, sqlalchemy actualiza automáticamente la identificación que se genera automáticamente en el backend
Encontré este problema y descubrí la razón exacta después de una investigación, mi modelo se creó con id como integerfield y en mi formulario, el id se representó con hiddenfield (ya que no quería mostrar el id en mi formulario). El campo oculto se representa por defecto como texto. una vez que cambié el formulario a integerfield con widget = hiddenInput ()) el problema se resolvió.
Deberías intentar usar en session.save_or_update(f)
lugar de session.add(f)
.
save_or_update
ha quedado en desuso desde 0.5 aproximadamente. session.add()
Deberías hacerlo.
echo=True
y ver qué SQL se ejecuta en el tiempo de descarga? Lo que describa debería funcionar y darle la identificación, pero puede haber algún otro problema que haga que f.id sea None.