Saya menggunakan SQLAlchemy dan setidaknya ada tiga entitas: engine
, session
dan connection
, yang memiliki execute
metode, jadi jika saya misalnya ingin memilih semua catatan dari table
saya bisa melakukan ini
engine.execute(select([table])).fetchall()
dan ini
connection.execute(select([table])).fetchall()
dan bahkan ini
session.execute(select([table])).fetchall()
- hasilnya akan sama.
Seperti yang saya pahami, jika seseorang menggunakannya engine.execute
menciptakan connection
, terbuka session
(Alkimia mengurusnya untuk Anda) dan menjalankan kueri. Tetapi apakah ada perbedaan global antara ketiga cara ini dalam melakukan tugas seperti itu?
Jawaban:
Tinjauan satu garis:
Perilaku
execute()
adalah sama dalam semua kasus, tetapi mereka 3 metode yang berbeda, diEngine
,Connection
, danSession
kelas.Apa sebenarnya itu
execute()
:Untuk memahami perilaku
execute()
kita perlu melihat ke dalamExecutable
kelas.Executable
adalah superclass untuk semua "pernyataan" jenis objek, termasuk select (), delete (), update (), insert (), text () - dengan kata-kata sesederhana mungkin, danExecutable
merupakan konstruksi ekspresi SQL yang didukung oleh SQLAlchemy.Dalam semua kasus,
execute()
metode ini menggunakan teks SQL atau ekspresi SQL yang dikonstruksi yaitu setiap variasi konstruksi ekspresi SQL yang didukung dalam SQLAlchemy dan mengembalikan hasil kueri (aResultProxy
- MembungkusDB-API
objek kursor untuk memberikan akses yang lebih mudah ke kolom baris.)Untuk memperjelasnya lebih lanjut (hanya untuk klarifikasi konseptual, bukan pendekatan yang disarankan) :
Selain
Engine.execute()
(eksekusi tanpa sambungan),,Connection.execute()
danSession.execute()
, juga dimungkinkan untuk menggunakanexecute()
langsung padaExecutable
konstruksi apa pun . TheExecutable
kelas memiliki implementasi itu sendiriexecute()
- Sesuai dokumentasi resmi, satu baris deskripsi tentang apa yangexecute()
dilakukannya adalah " Kompilasi dan jalankan iniExecutable
". Dalam hal ini kita perlu secara eksplisit mengikatExecutable
(konstruksi ekspresi SQL) denganConnection
objek atau,Engine
objek (yang secara implisit mendapatkanConnection
objek), sehinggaexecute()
akan tahu di mana harus mengeksekusiSQL
.Contoh berikut menunjukkan dengan baik - Diberikan tabel seperti di bawah ini:
Eksekusi eksplisit yaitu
Connection.execute()
- meneruskan teks SQL atau membangun ekspresi SQL keexecute()
metodeConnection
:Eksekusi connectionless eksplisit yaitu
Engine.execute()
- melewati teks SQL atau membangun ekspresi SQL langsung keexecute()
metode Engine:Eksekusi implisit yaitu
Executable.execute()
- juga tanpa koneksi, dan memanggilexecute()
metodeExecutable
, yaitu, memanggilexecute()
metode langsung padaSQL
konstruksi ekspresi (turunan dariExecutable
) itu sendiri.Catatan: Menyebutkan contoh eksekusi implisit untuk tujuan klarifikasi - cara eksekusi ini sangat tidak disarankan - sesuai dokumen :
Pertanyaan Anda:
Anda benar untuk bagian "jika seseorang menggunakannya
engine.execute
menciptakanconnection
" tetapi tidak untuk "terbukasession
(Alkimia peduli untuk Anda) dan mengeksekusi permintaan" - MenggunakanEngine.execute()
danConnection.execute()
(hampir) satu hal yang sama, secara formal,Connection
objek dibuat secara implisit , dan dalam kasus selanjutnya kami secara eksplisit instantiate. Apa yang sebenarnya terjadi dalam kasus ini adalah:Pada lapisan DB itu hal yang persis sama, semuanya mengeksekusi SQL (ekspresi teks atau berbagai konstruksi ekspresi SQL). Dari sudut pandang aplikasi ada dua opsi:
Engine.execute()
atauConnection.execute()
sessions
- efisien menangani transaksi sebagai unit tunggal-of-kerja, dengan mudah melaluisession.add()
,session.rollback()
,session.commit()
,session.close()
. Ini adalah cara untuk berinteraksi dengan DB jika ORM yaitu tabel yang dipetakan. Memberikan identity_map untuk secara instan mengakses objek yang baru dibuat / ditambahkan saat permintaan tunggal.Session.execute()
akhirnya menggunakanConnection.execute()
metode eksekusi pernyataan untuk mengeksekusi pernyataan SQL. MenggunakanSession
objek adalah cara yang direkomendasikan oleh SQLAlchemy ORM untuk aplikasi berinteraksi dengan database.Kutipan dari dokumen :
sumber
Jawaban Nabeel mencakup banyak detail dan sangat membantu, tetapi saya merasa bingung untuk mengikuti. Karena ini adalah hasil Google pertama untuk masalah ini, menambahkan pemahaman saya tentang hal itu untuk orang-orang masa depan yang menemukan pertanyaan ini:
Menjalankan .execute ()
Sebagaimana OP dan Nabell Ahmed sama-sama catat, ketika mengeksekusi sebuah dataran
SELECT * FROM tablename
, tidak ada perbedaan dalam hasil yang diberikan.Perbedaan antara ketiga benda-benda ini menjadi penting tergantung pada konteks bahwa
SELECT
pernyataan digunakan dalam atau, lebih umum, ketika Anda ingin melakukan hal-hal lain sepertiINSERT
,DELETE
, dllKapan menggunakan Engine, Connection, Session pada umumnya
Engine adalah objek level terendah yang digunakan oleh SQLAlchemy. Itu memelihara kumpulan koneksi yang tersedia untuk digunakan setiap kali aplikasi perlu berbicara dengan database.
.execute()
adalah metode kenyamanan yang pertama kali memanggilconn = engine.connect(close_with_result=True)
dan kemudianconn.execute()
. Parameter close_with_result berarti koneksi ditutup secara otomatis. (Saya sedikit memparafrasekan kode sumber, tetapi pada dasarnya benar). sunting: Ini kode sumber untuk engine.executeAnda dapat menggunakan mesin untuk menjalankan SQL mentah.
Ini tercakup dalam dokumen di bawah ini penggunaan dasar .
Koneksi (seperti yang kita lihat di atas) adalah hal yang benar-benar berfungsi mengeksekusi query SQL. Anda harus melakukan ini kapan pun Anda ingin kontrol yang lebih besar atas atribut koneksi, ketika itu ditutup, dll. Misalnya, contoh yang sangat penting dari ini adalah Transaksi , yang memungkinkan Anda memutuskan kapan akan melakukan perubahan Anda ke database. Dalam penggunaan normal, perubahan dilakukan secara otomatis. Dengan menggunakan transaksi, Anda dapat (misalnya) menjalankan beberapa pernyataan SQL yang berbeda dan jika ada yang salah dengan salah satunya, Anda dapat membatalkan semua perubahan sekaligus.
Ini akan memungkinkan Anda membatalkan kedua perubahan jika salah satu gagal, seperti jika Anda lupa membuat tabel datalog.
Jadi jika Anda mengeksekusi kode SQL mentah dan perlu kontrol, gunakan koneksi
Sesi digunakan untuk aspek Object Relationship Management (ORM) dari SQLAlchemy (sebenarnya Anda dapat melihat ini dari cara mereka diimpor:)
from sqlalchemy.orm import sessionmaker
. Mereka menggunakan koneksi dan transaksi di bawah tenda untuk menjalankan pernyataan SQL yang dibuat secara otomatis..execute()
adalah fungsi kenyamanan yang melewati ke sesi apa pun terikat (biasanya mesin, tetapi dapat koneksi).Jika Anda menggunakan fungsionalitas ORM, gunakan sesi; jika Anda hanya melakukan query SQL langsung yang tidak terikat pada objek, Anda mungkin lebih baik menggunakan koneksi secara langsung.
sumber
""
?my_session.connection()
. Documents: docs.sqlalchemy.org/en/13/orm/… .Berikut adalah contoh menjalankan DCL (Data Control Language) seperti GRANT
sumber