Bagaimana Anda menjalankan SQL mentah dalam SQLAlchemy?
Saya memiliki aplikasi web python yang berjalan di labu dan antarmuka ke database melalui SQLAlchemy.
Saya perlu cara untuk menjalankan SQL mentah. Kueri melibatkan beberapa tabel bergabung bersama dengan tampilan Inline.
Saya sudah mencoba:
connection = db.session.connection()
connection.execute( <sql here> )
Tapi saya terus mendapatkan kesalahan gateway.
python
sql
sqlalchemy
flask
flask-sqlalchemy
starwing123
sumber
sumber
namedtuple
dandict
secara langsung: initd.org/psycopg/docs/extras.html .Jawaban:
Sudahkah Anda mencoba:
atau:
sumber
BEGIN
danCOMMIT
pernyataan sendiri.db.engine.execute(text("<sql here>")).execution_options(autocommit=True))
mengeksekusi dan melakukannya juga.Objek sesi Alkimia SQL memiliki
execute
metode sendiri :Semua permintaan aplikasi Anda harus melalui objek sesi, apakah itu SQL mentah atau tidak. Ini memastikan bahwa kueri dikelola dengan baik oleh transaksi , yang memungkinkan beberapa kueri dalam permintaan yang sama dilakukan atau dibatalkan sebagai satu kesatuan. Pergi keluar dari transaksi menggunakan mesin atau koneksi membuat Anda berisiko lebih besar untuk tersamar, mungkin sulit untuk mendeteksi bug yang dapat membuat Anda dengan data yang rusak. Setiap permintaan harus dikaitkan dengan hanya satu transaksi, dan menggunakan
db.session
akan memastikan ini adalah kasus untuk aplikasi Anda.Perhatikan juga yang
execute
dirancang untuk kueri parameter . Gunakan parameter, seperti:val
pada contoh, untuk setiap input ke kueri untuk melindungi diri Anda dari serangan injeksi SQL. Anda dapat memberikan nilai untuk parameter ini dengan melewatkan adict
argumen kedua, di mana setiap kunci adalah nama parameter seperti yang muncul dalam kueri. Sintaks yang tepat dari parameter itu sendiri mungkin berbeda tergantung pada database Anda, tetapi semua database relasional utama mendukungnya dalam beberapa bentuk.Dengan asumsi itu sebuah
SELECT
query, ini akan mengembalikan sebuah iterable dariRowProxy
objek.Anda dapat mengakses setiap kolom dengan berbagai teknik:
Secara pribadi, saya lebih suka mengonversi hasilnya menjadi
namedtuple
s:Jika Anda tidak menggunakan ekstensi Flask-SQLAlchemy, Anda masih dapat dengan mudah menggunakan sesi:
sumber
docs: Tutorial Bahasa Ekspresi SQL - Menggunakan Teks
contoh:
sumber
==
?=
biasanya disediakan untuk menetapkan nilai; sedangkan==
dicadangkan untuk membandingkan nilaiAnda bisa mendapatkan hasil dari query SQL SELECT menggunakan
from_statement()
dantext()
seperti yang ditunjukkan di sini . Anda tidak harus berurusan dengan tuple dengan cara ini. Sebagai contoh untuk kelas yangUser
memiliki nama tabelusers
yang dapat Anda coba,sumber
mengeksekusi
<sql here>
tetapi tidak melakukan itu kecuali Anda berada diautocommit
mode. Jadi, sisipan dan pembaruan tidak akan tercermin dalam database.Untuk melakukan setelah perubahan, lakukan
sumber
Pertama, petakan modul Anda (jika modul / aplikasi Anda manage.py di folder utama dan Anda berada di sistem Operasi UNIX), jalankan:
Jalankan Flask shell
Impor apa yang kita butuhkan ::
Jalankan kueri Anda:
Ini menggunakan koneksi database saat ini yang memiliki aplikasi.
sumber
Sudahkah Anda mencoba menggunakan
connection.execute(text( <sql here> ), <bind params here> )
dan mengikat parameter seperti yang dijelaskan dalam dokumen ? Ini dapat membantu memecahkan banyak pemformatan parameter dan masalah kinerja. Mungkin kesalahan gateway adalah batas waktu? Parameter binding cenderung membuat query kompleks dieksekusi lebih cepat.sumber
connection.execute(text(<sql here>), <bind params> )
.bind params
TIDAK harus dalamtext()
. memberi makan dalam parameter bind ke metode execute ()Jika Anda ingin menghindari tupel, cara lain adalah dengan memanggil
first
,one
atauall
metode:sumber