ฉันกำลังทำงานกับฐานโค้ดขนาดใหญ่โดยใช้ SQL Alchemy เราเพิ่งเปลี่ยนเป็น structlog สำหรับการบันทึก และพฤติกรรมของ SQLAlchemy เปลี่ยนไป ในฟังก์ชันที่มีการแทรกข้อมูลลงใน MySQL หากการเรียก session.commit() อยู่ก่อนคำสั่งบันทึกและไม่ได้อยู่ในส่วนคำสั่งสุดท้าย อ็อบเจ็กต์จะกลายเป็น None
model_obj ว่างเปล่าเมื่อส่งคืนในโค้ดต่อไปนี้:
model_obj = json.loads(model_serialized, object_hook=from_json)
try:
session.add(model_obj)
session.commit()
config.logger.debug("added model_obj", model_obj=model_obj)
except IntegrityError as e:
config.logger.debug("model_obj already exists", model_obj=model_obj, e=str(e))
return createAndEncodeErrorElements(
ErrorCodeDatabaseSQLAlchemyIntegrityError, None
)
else:
response = createAndEncodeSuccessElementsWithData({model_obj: model_obj})
return response
finally:
session.close()
model_obj ไม่ว่างเปล่าเมื่อส่งคืนในโค้ดต่อไปนี้: model_obj = json.loads(model_serialized, object_hook=from_json)
try:
session.add(model_obj)
config.logger.debug("added model_obj", model_obj=model_obj)
except IntegrityError as e:
config.logger.debug("model_obj already exists", model_obj=model_obj, e=str(e))
return createAndEncodeErrorElements(
ErrorCodeDatabaseSQLAlchemyIntegrityError, None
)
else:
response = createAndEncodeSuccessElementsWithData({model_obj: model_obj})
return response
finally:
session.commit()
session.close()
เหตุใด session.commit() จึงต้องอยู่ในส่วนคำสั่งสุดท้าย? พฤติกรรมพื้นฐานของ SQLAlchemy คืออะไร
model_obj
กลายเป็นNone
ไม่ใช่สิ่งที่ SQLAlchemy ควรจะเกี่ยวข้อง และฉันคิดว่าปัญหาของคุณซ่อนอยู่ในcreateAndEncodeSuccessElementsWithData
หากเป็นเช่นนั้น ในทางกลับกัน หากคุณหมายถึงคุณลักษณะของmodel_obj
กลายเป็นNone
ดูว่า @snakecharmerb ตอบอะไร - person Ilja Everilä   schedule 03.05.2020