เหตุใดจึงต้องล้างหากคุณสามารถกระทำได้
ในฐานะที่เป็นคนใหม่ในการทำงานกับฐานข้อมูลและ sqlalchemy คำตอบก่อนหน้า - ที่flush()
ส่งคำสั่ง SQL ไปยังฐานข้อมูลและยืนยันcommit()
พวกเขา - ไม่ชัดเจนสำหรับฉัน คำจำกัดความมีเหตุผล แต่ก็ไม่ชัดเจนในทันทีจากคำนิยามว่าทำไมคุณจึงต้องใช้ flush แทนที่จะเป็นแค่การคอมมิท
เนื่องจากคอมมิชชัน flushes เสมอ ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ) เสียงเหล่านี้คล้ายกันจริงๆ ฉันคิดว่าประเด็นสำคัญที่ต้องเน้นคือการล้างข้อมูลไม่ถาวรและสามารถยกเลิกได้ในขณะที่การคอมมิทเป็นสิ่งถาวรในแง่ที่ว่าคุณไม่สามารถขอให้ฐานข้อมูลเลิกทำการคอมมิทครั้งล่าสุดได้ (ฉันคิดว่า)
@snapshoe เน้นว่าถ้าคุณต้องการสืบค้นฐานข้อมูลและรับผลลัพธ์ที่มีวัตถุที่เพิ่มเข้ามาใหม่คุณต้องล้างข้อมูลก่อน (หรือกระทำซึ่งจะล้างข้อมูลให้คุณ) บางทีนี่อาจเป็นประโยชน์สำหรับบางคนแม้ว่าฉันจะไม่แน่ใจว่าทำไมคุณถึงต้องการล้างข้อมูลมากกว่าทำ (ไม่ใช่คำตอบที่ไม่สำคัญซึ่งมันสามารถยกเลิกได้)
ในอีกตัวอย่างหนึ่งฉันกำลังซิงค์เอกสารระหว่างฐานข้อมูลท้องถิ่นและเซิร์ฟเวอร์ระยะไกลและหากผู้ใช้ตัดสินใจที่จะยกเลิกการเพิ่ม / ปรับปรุง / ลบทั้งหมดควรจะเลิกทำ (เช่นไม่มีการซิงค์บางส่วนเท่านั้นการซิงค์แบบเต็ม) เมื่ออัปเดตเอกสารเดียวฉันตัดสินใจที่จะลบแถวเก่าและเพิ่มเวอร์ชันที่อัปเดตจากเซิร์ฟเวอร์ระยะไกล ปรากฎว่าเนื่องจากวิธีการเขียน sqlalchemy คำสั่งของการดำเนินการเมื่อไม่รับประกัน สิ่งนี้ส่งผลให้มีการเพิ่มเวอร์ชันที่ซ้ำกัน (ก่อนที่จะพยายามลบเวอร์ชันเก่า) ซึ่งส่งผลให้ฐานข้อมูลล้มเหลวในข้อ จำกัด ที่ไม่ซ้ำกัน เพื่อหลีกเลี่ยงปัญหานี้ฉันใช้flush()
เพื่อรักษาลำดับไว้ แต่ฉันยังสามารถยกเลิกได้ในภายหลังหากกระบวนการซิงค์ล้มเหลว
ดูโพสต์ของฉันที่นี่ : มีคำสั่งสำหรับการเพิ่มและลบเมื่อกระทำใน sqlalchemy
ในทำนองเดียวกันบางคนต้องการทราบว่าจะเพิ่มลำดับการสั่งซื้อไว้หรือไม่เช่นถ้าฉันเพิ่มobject1
แล้วเพิ่มobject2
จะobject1
ได้รับการเพิ่มลงในฐานข้อมูลก่อนobject2
หรือไม่ SQLAlchemy บันทึกคำสั่งซื้อเมื่อเพิ่มวัตถุในเซสชันหรือไม่
อีกครั้งที่นี่น่าจะเป็นการใช้ flush () จะทำให้แน่ใจว่าพฤติกรรมที่ต้องการ ดังนั้นโดยสรุปการใช้ฟลัชหนึ่งครั้งคือการรับประกันการสั่งซื้อ (ฉันคิดว่า) อีกครั้งในขณะที่ยังให้ตัวเลือก "เลิกทำ" ที่ยอมรับไม่ได้ให้
Autoflush และ Autocommit
หมายเหตุ autoflush สามารถนำมาใช้เพื่อให้แน่ใจว่าแบบสอบถามดำเนินการกับฐานข้อมูลที่ได้รับการปรับปรุงเนื่องจาก sqlalchemy จะล้างออกก่อนที่จะดำเนินการค้นหา https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
Autocommit เป็นอย่างอื่นที่ฉันไม่เข้าใจอย่างสมบูรณ์ แต่ดูเหมือนว่าการใช้งานของมันจะหมดกำลังใจ:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params autocommit
การใช้ความจำ
ตอนนี้คำถามเดิมต้องการทราบเกี่ยวกับผลกระทบของการลบออกและกระทำเพื่อวัตถุประสงค์ของหน่วยความจำ เนื่องจากความสามารถในการคงอยู่หรือไม่เป็นสิ่งที่ฐานข้อมูลนำเสนอ (ฉันคิดว่า) เพียงแค่ล้างควรจะเพียงพอที่จะ offload ไปยังฐานข้อมูล - แม้ว่าการกระทำไม่ควรเจ็บ (จริง ๆ แล้วอาจช่วย - ดูด้านล่าง) ถ้าคุณไม่สนใจ .
sqlalchemy ใช้การอ้างอิงที่อ่อนแอสำหรับวัตถุที่ถูกลบทิ้ง: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
ซึ่งหมายความว่าถ้าคุณไม่มีวัตถุที่จัดขึ้นอย่างชัดเจนเช่นในรายการหรือ dict sqlalchemy จะไม่เก็บไว้ในหน่วยความจำ
อย่างไรก็ตามคุณมีฐานข้อมูลด้านสิ่งที่ต้องกังวล สันนิษฐานว่าการชะล้างโดยไม่ส่งข้อมูลมาพร้อมกับการปรับหน่วยความจำเพื่อรักษาธุรกรรม อีกครั้งฉันยังใหม่กับสิ่งนี้ แต่นี่คือลิงค์ที่ดูเหมือนจะแนะนำตรงนี้: https://stackoverflow.com/a/15305650/764365
กล่าวอีกนัยหนึ่งว่าคอมมิทจะลดการใช้หน่วยความจำแม้ว่าจะมีการแลกเปลี่ยนระหว่างหน่วยความจำและประสิทธิภาพที่นี่ คุณอาจไม่ต้องการเปลี่ยนแปลงฐานข้อมูลทุกครั้งทีละครั้ง (ด้วยเหตุผลด้านประสิทธิภาพ) แต่การรอนานเกินไปจะเพิ่มการใช้หน่วยความจำ