ภาพรวมหนึ่งบรรทัด:
ลักษณะการทำงานของ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 และการเชื่อมต่อเป็นแบบราชา (และราชินี?) - อ่านต่อ