Quiero hacer algo como esto:
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()
Pero f.id
es None
cuando lo intento. ¿Cómo puedo hacer que esto funcione?
python
sqlalchemy
Eloff
fuente
fuente
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.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 delflush()
proceso a medida que se generan, y no secommit()
debe requerir ninguna llamada a . Entonces, la respuesta aquí radica en uno o más de los siguientes:fuente
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í:
Así es como se hace.
fuente
sessionmaker(autoflush=True)
, ese combo w / refresh () me proporcionó el ID de fila. #grrrflush()
ycommit()
, aquí hay una buena explicación: stackoverflow.com/a/4202016/1252290flush()
usarcommit()
y justo después de eso, actualícelo consession.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:
después de modificado:
luego
esta bien!
fuente
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ó.
fuente
Una vez tuve un problema con haber asignado
0
a id antes de llamar alsession.add
método. La base de datos asignó correctamente la identificación, pero la identificación correcta no se recuperó de la sesión posteriorsession.flush()
.fuente
Deberías intentar usar en
session.save_or_update(f)
lugar desession.add(f)
.fuente
save_or_update
ha quedado en desuso desde 0.5 aproximadamente.session.add()
Deberías hacerlo.