Tek satırlık bir genel bakış:
Davranışı execute()
her durumda aynı, ama onlar 3 farklı yöntem, içindedir Engine
, Connection
ve Session
sınıflar.
Tam olarak nedir execute()
:
Davranışını anlamak execute()
için Executable
sınıfa bakmamız gerekir . Executable
select (), delete (), update (), insert (), text () dahil olmak üzere tüm "ifade" türleri için bir üst sınıftır - mümkün olan en basit sözcüklerle, Executable
SQLAlchemy'de desteklenen bir SQL ifade yapısıdır.
Tüm durumlarda, execute()
yöntem SQL metnini veya oluşturulmuş SQL ifadesini alır, yani SQLAlchemy'de desteklenen çeşitli SQL ifade yapılarından herhangi birini alır ve sorgu sonuçlarını döndürür (a ResultProxy
- DB-API
Satır sütunlarına daha kolay erişim sağlamak için bir imleç nesnesini sarar .)
Daha fazla açıklığa kavuşturmak için (yalnızca kavramsal açıklama için, önerilen bir yaklaşım değil) :
Engine.execute()
(Bağlantısız yürütme) ' ye ek olarak Connection.execute()
ve herhangi bir yapı üzerinde doğrudan Session.execute()
kullanmak da mümkündür . Sınıf içinde, bu kendi uygulaması vardır - resmi belgeler başına As, peki ya bir satır açıklama yapar "dir Derleme ve bu yürütmek ". Bu durumda biz açıkça bağlamak gerekir bir ile (SQL İfade yapısı) nesne ya, nesne (ki örtük bir olsun nesnesi) bu yüzden, yürütmek için nereye bilecek .execute()
Executable
Executable
execute()
execute()
Executable
Executable
Connection
Engine
Connection
execute()
SQL
Aşağıdaki örnek bunu iyi göstermektedir - Aşağıdaki gibi bir tablo verildiğinde:
from sqlalchemy import MetaData, Table, Column, Integer
meta = MetaData()
users_table = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50)))
Açık yürütme yani Connection.execute()
- SQL metnini veya oluşturulmuş SQL ifadesini şu execute()
yönteme geçirmek Connection
:
engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())
for row in result:
# ....
connection.close()
Açık bağlantısız yürütme, yani Engine.execute()
- SQL metnini veya oluşturulmuş SQL ifadesini doğrudan execute()
Engine yöntemine geçirme :
engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
# ....
result.close()
Örtük yürütme ie Executable.execute()
- ayrıca bağlantısızdır ve execute()
yöntemini çağırır Executable
, yani execute()
yöntemi doğrudan SQL
ifade yapısı (bir örneği Executable
) üzerinde çağırır .
engine = create_engine('sqlite:///file.db')
meta.bind = engine
result = users_table.select().execute()
for row in result:
# ....
result.close()
Not: Açıklığa kavuşturmak amacıyla örtük yürütme örneğini belirtmiştir - bu tür bir yürütme kesinlikle önerilmez - belgelere göre :
"Örtük yürütme", çoğu durumda yardımcı olduğundan daha kafa karıştırıcı olan çok eski bir kullanım modelidir ve kullanımı tavsiye edilmez. Her iki model de, uygulama tasarımında daha sonra sorunlara yol açan uygun “kısa yolların” aşırı kullanımını teşvik ediyor gibi görünmektedir.
Sorularınız:
Anladığım kadarıyla birisi engine.execute kullanırsa bağlantı oluşturur, oturum açar (Alchemy sizin için önemser) ve sorgu çalıştırır.
"Birisi engine.execute
onu kullanırsa connection
" ama için değil " bölümü için haklısınız session
(Simya sizin için önemser) ve sorgu yürütür" - Kullanmak Engine.execute()
ve Connection.execute()
(neredeyse) aynı şeydir, biçimsel olarak Connection
nesne örtük olarak oluşturulur ve sonraki durumda bunu açıkça somutlaştırırız. Bu durumda gerçekten olan şey şudur:
`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`
Ancak bu tür bir görevi yerine getirmenin bu üç yolu arasında küresel bir fark var mı?
DB katmanında bu tamamen aynı şey, hepsi SQL (metin ifadesi veya çeşitli SQL ifade yapıları) yürütüyor. Uygulamanın bakış açısından iki seçenek vardır:
- Doğrudan yürütme - Kullanarak
Engine.execute()
veyaConnection.execute()
- Kullanma
sessions
- etkili bir şekilde tek bir birim bölgesinin çalışması olarak hareket işleme kolaylıkla ile session.add()
, session.rollback()
, session.commit()
, session.close()
. ORM, yani eşlenmiş tablolar durumunda DB ile etkileşime girmenin yoludur. Tek bir istek sırasında halihazırda erişilen veya yeni oluşturulan / eklenen nesnelere anında ulaşmak için kimlik haritası sağlar .
Session.execute()
sonuçta Connection.execute()
SQL ifadesini yürütmek için ifade yürütme yöntemini kullanır . Session
Nesne kullanmak , SQLAlchemy ORM'nin bir uygulamanın veritabanıyla etkileşime girmesi için önerdiği yoldur.
Dokümanlardan bir alıntı :
SQLAlchemy ORM kullanılırken bu nesnelere genel olarak erişilmediğine dikkat etmek önemlidir; bunun yerine, Session nesnesi veritabanına arabirim olarak kullanılır. Ancak, ORM'nin üst düzey yönetim hizmetlerinin müdahalesi olmadan metinsel SQL ifadelerinin ve / veya SQL ifade yapılarının doğrudan kullanımı etrafında inşa edilen uygulamalar için, Motor ve Bağlantı kraldır (ve kraliçedir?) - okumaya devam edin.