Objek sesi Alkimia SQL memiliki executemetode sendiri :
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
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.sessionakan memastikan ini adalah kasus untuk aplikasi Anda.
Perhatikan juga yang executedirancang untuk kueri parameter . Gunakan parameter, seperti :valpada 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 SELECTquery, ini akan mengembalikan sebuah iterable dariRowProxy objek.
Anda dapat mengakses setiap kolom dengan berbagai teknik:
for r in result:
print(r[0]) # Access by positional index
print(r['my_column']) # Access by column name as a string
r_dict = dict(r.items()) # convert to dict keyed by column names
Secara pribadi, saya lebih suka mengonversi hasilnya menjadi namedtuples:
from collections import namedtuple
Record = namedtuple('Record', result.keys())
records = [Record(*r) for r in result.fetchall()]
for r in records:
print(r.my_column)
print(r)
Jika Anda tidak menggunakan ekstensi Flask-SQLAlchemy, Anda masih dapat dengan mudah menggunakan sesi:
import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session
engine = sqlalchemy.create_engine('my connection string')
Session = scoped_session(sessionmaker(bind=engine))
s = Session()
result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})