ภาพรวมหนึ่งบรรทัด:
ลักษณะการทำงานของexecute()จะเหมือนกันในทุกกรณี แต่พวกเขามี 3 วิธีที่แตกต่างกันในEngine, ConnectionและSessionชั้นเรียน
คืออะไรกันแน่execute():
เพื่อให้เข้าใจพฤติกรรมของexecute()เราจำเป็นต้องดูในExecutableชั้นเรียน Executableเป็นซูเปอร์คลาสสำหรับอ็อบเจ็กต์ประเภท "คำสั่ง" ทั้งหมดรวมถึง select (), delete (), update (), insert (), text () - ในคำที่ง่ายที่สุด an Executableคือการสร้างนิพจน์ SQL ที่รองรับใน SQLAlchemy
ในทุกกรณีexecute()เมธอดจะใช้ข้อความ SQL หรือนิพจน์ SQL ที่สร้างขึ้นเช่นการสร้างนิพจน์ SQL ที่หลากหลายที่รองรับใน SQLAlchemy และส่งกลับผลลัพธ์เคียวรี (a ResultProxy- ตัดDB-APIวัตถุเคอร์เซอร์เพื่อให้สามารถเข้าถึงคอลัมน์แถวได้ง่ายขึ้น)
เพื่อชี้แจงเพิ่มเติม (สำหรับการชี้แจงเชิงแนวคิดเท่านั้นไม่ใช่แนวทางที่แนะนำ) :
นอกเหนือจากEngine.execute()(การดำเนินการแบบไร้การเชื่อมต่อ) Connection.execute()และSession.execute()ยังสามารถใช้execute()โดยตรงกับExecutableโครงสร้างใด ๆ Executableชั้นจะมีการดำเนินการของตัวเองของexecute()- เป็นต่อเอกสารอย่างเป็นทางการรายละเอียดบรรทัดหนึ่งเกี่ยวกับสิ่งexecute()ที่ไม่เป็น " คอมไพล์และรันนี้Executable " ในกรณีนี้เราจำเป็นต้องผูกExecutable(โครงสร้างนิพจน์ SQL) อย่างชัดเจนกับConnectionอ็อบเจ็กต์หรือEngineอ็อบเจกต์ (ซึ่งโดยปริยายรับConnectionอ็อบเจกต์) ดังนั้นexecute()จะรู้ว่าจะรันไฟล์SQL.
ตัวอย่างต่อไปนี้แสดงให้เห็นได้ดี - ให้ตารางด้านล่าง:
from sqlalchemy import MetaData, Table, Column, Integer
meta = MetaData()
users_table = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50)))
การดำเนินการอย่างชัดเจนเช่นConnection.execute()- ส่งผ่านข้อความ SQL หรือนิพจน์ SQL ที่สร้างขึ้นไปยังexecute()เมธอดConnection:
engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())
for row in result:
# ....
connection.close()
การดำเนินการที่ชัดเจนโดยไม่ต้องเชื่อมต่อเช่นEngine.execute()- ส่งข้อความ SQL หรือนิพจน์ SQL ที่สร้างขึ้นโดยตรงไปยังexecute()เมธอดของ Engine
engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
# ....
result.close()
การดำเนินการโดยนัยเช่นExecutable.execute()- ยังไม่มีการเชื่อมต่อและเรียกexecute()เมธอดของ the Executableนั่นคือมันเรียกexecute()วิธีการโดยตรงบนโครงสร้างSQLนิพจน์ (อินสแตนซ์ของExecutable) เอง
engine = create_engine('sqlite:///file.db')
meta.bind = engine
result = users_table.select().execute()
for row in result:
# ....
result.close()
หมายเหตุ: ระบุตัวอย่างการดำเนินการโดยนัยเพื่อวัตถุประสงค์ในการชี้แจง - ไม่แนะนำให้ใช้วิธีการดำเนินการนี้เป็นอย่างยิ่ง - ตามเอกสาร :
"การดำเนินการโดยนัย" เป็นรูปแบบการใช้งานที่เก่ามากซึ่งในกรณีส่วนใหญ่จะสับสนมากกว่าที่จะเป็นประโยชน์และไม่สนับสนุนการใช้งาน รูปแบบทั้งสองดูเหมือนจะส่งเสริมให้ใช้ "ทางลัด" ที่เหมาะสมมากเกินไปในการออกแบบแอปพลิเคชันซึ่งนำไปสู่ปัญหาในภายหลัง
คำถามของคุณ:
ตามที่ฉันเข้าใจหากมีคนใช้ engine.execute มันสร้างการเชื่อมต่อเปิดเซสชัน (Alchemy สนใจเกี่ยวกับมันสำหรับคุณ) และดำเนินการค้นหา
คุณเหมาะสมกับส่วน "ถ้ามีคนใช้engine.executeมันสร้างconnection" แต่ไม่ใช่สำหรับ "เปิดsession(การเล่นแร่แปรธาตุใส่ใจคุณ) และดำเนินการสืบค้น" - การใช้Engine.execute()และConnection.execute()(เกือบ) เป็นสิ่งเดียวกันในทางการConnectionวัตถุจะถูกสร้างขึ้นโดยปริยาย และในกรณีต่อมาเราได้สร้างอินสแตนซ์อย่างชัดเจน สิ่งที่เกิดขึ้นในกรณีนี้คือ:
`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`
แต่มีความแตกต่างกันทั่วโลกระหว่างสามวิธีในการปฏิบัติงานดังกล่าวหรือไม่?
ที่เลเยอร์ DB มันเหมือนกันทุกประการทุกประการกำลังเรียกใช้ SQL (นิพจน์ข้อความหรือโครงสร้างนิพจน์ SQL ต่างๆ) จากมุมมองของแอปพลิเคชันมีสองตัวเลือก:
- การดำเนินการโดยตรง - การใช้
Engine.execute()หรือConnection.execute()
- การใช้
sessions- มีประสิทธิภาพจัดการกับการทำธุรกรรมเป็นหน่วยเดียวของการทำงานได้อย่างง่ายดายผ่านทางsession.add(), session.rollback(), ,session.commit() session.close()เป็นวิธีการโต้ตอบกับ DB ในกรณีของ ORM เช่นตารางที่แมป จัดเตรียมidentity_mapสำหรับการเข้าถึงทันทีหรืออ็อบเจ็กต์ที่สร้าง / เพิ่มใหม่ในระหว่างการร้องขอเดียว
Session.execute()ในที่สุดใช้Connection.execute()วิธีการดำเนินการคำสั่งเพื่อดำเนินการคำสั่ง SQL การใช้Sessionออบเจ็กต์เป็นวิธีที่แนะนำของ SQLAlchemy ORM สำหรับแอปพลิเคชันเพื่อโต้ตอบกับฐานข้อมูล
ข้อความที่ตัดตอนมาจากเอกสาร :
สิ่งสำคัญที่ควรทราบคือเมื่อใช้ SQLAlchemy ORM วัตถุเหล่านี้จะไม่สามารถเข้าถึงได้โดยทั่วไป แทนที่จะใช้วัตถุเซสชันเป็นส่วนต่อประสานกับฐานข้อมูล อย่างไรก็ตามสำหรับแอปพลิเคชันที่สร้างขึ้นจากการใช้คำสั่ง SQL แบบข้อความและ / หรือนิพจน์ SQL โดยตรงโดยไม่เกี่ยวข้องกับบริการการจัดการระดับที่สูงขึ้นของ ORM Engine และการเชื่อมต่อเป็นแบบราชา (และราชินี?) - อ่านต่อ