Un patrón recurrente en mi programación de Python en GAE es obtener una entidad del almacén de datos, y luego posiblemente cambiar esa entidad en función de varias condiciones. Al final, tengo que devolver() la entidad al almacén de datos para garantizar que se guarden los cambios que puedan haberse realizado.Forma elegante de evitar .put() en entidades sin cambios
Sin embargo, a menudo no se realizaron cambios y el .put final() es solo una pérdida de dinero. ¿Cómo puedo asegurarme fácilmente de que solo coloque una entidad si realmente ha cambiado?
El código podría ser algo así como
def handle_get_request():
entity = Entity.get_by_key_name("foobar")
if phase_of_moon() == "full":
entity.werewolf = True
if random.choice([True, False]):
entity.lucky = True
if some_complicated_condition:
entity.answer = 42
entity.put()
pude mantener una bandera "cambiado", la cual di si cualquier condición cambió la entidad, pero que parece muy frágil. Si olvidé configurarlo en algún lugar, entonces los cambios se perderían.
Lo que terminé usando
def handle_get_request():
entity = Entity.get_by_key_name("foobar")
original_xml = entity.to_xml()
if phase_of_moon() == "full":
entity.werewolf = True
if random.choice([True, False]):
entity.lucky = True
if some_complicated_condition:
entity.answer = 42
if entity.to_xml() != original_xml: entity.put()
Yo no diría que este "elegante". Elegante sería si el objeto simplemente se guardara automáticamente al final, pero sentí que esto era lo suficientemente simple y fácil de leer por ahora.
¿Qué tal hash la entidad antes y después?Eso por supuesto requiere crear una función hash, que puede o no ser factible para su caso – carlpett
@carlpett Gracias, noté que db.Model ya tiene el método to_xml(), que puedo usar para comparar en lugar de hacer mi propia función hash . – Bemmu