transaction query example python sqlalchemy

python - query - sqlalchemy session execute parameters



sqlalchemy flush() y obtener id insertado? (6)

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 Ninguno cuando lo intento. ¿Cómo puedo hacer que esto funcione?

-Dan


Acabo de encontrarme con el mismo problema y, después de las pruebas, descubrí que NINGUNA de estas respuestas es suficiente.

Actualmente, o a partir de sqlalchemy .6+, existe una solución muy simple (no sé si esto existe en versiones anteriores, aunque me imagino que sí):

session.refresh ()

Entonces, tu 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 hacerlo.


Debería intentar usar session.save_or_update(f) lugar de session.add(f) .


Gracias por 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, autoincreament=True, nullable=True)

luego session.flush()
print(f.id)
session.flush()
print(f.id)

está bien!


Su código de muestra debería haber funcionado como está. Sqlalchemy debería proporcionar un valor para f.id , suponiendo que es una columna de clave principal autogeneradora. Los atributos de clave primaria se rellenan inmediatamente dentro del proceso flush () a medida que se generan y no es necesario llamar a commit (). Así que la respuesta aquí radica en los detalles de su mapeo, si hay alguna peculiaridad extraña del backend en uso (como, por ejemplo, SQLite no genera valores enteros para una clave primaria compuesta) y / o lo que dice el SQL emitido cuando usted enciende el eco


Una vez tuve un problema con haber asignado 0 a id antes de llamar al método session.add . La base de datos asignó correctamente la identificación, pero la identificación correcta no se recuperó de la sesión después de session.flush() .


a diferencia de la respuesta dada por dpb, una actualización no es necesaria. una vez que descarga, puede acceder al campo de identificación, sqlalchemy actualiza automáticamente la identificación que se genera automáticamente en el servidor

Encontré este problema y calculé el motivo exacto después de una investigación, mi modelo se creó con id como integerfield y en mi forma el ID se representó con hiddenfield (ya que no quería mostrar el id en mi formulario). El campo oculto está representado por defecto como un texto. una vez que cambié el formulario a integerfield con widget = hiddenInput ()) el problema fue resuelto.