Objek sesi Alkimia SQL memiliki execute
metode 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.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:
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 namedtuple
s:
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})