Các đối tượng phiên Alchemy SQL có execute
phương thức riêng của chúng :
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Tất cả các truy vấn ứng dụng của bạn phải trải qua một đối tượng phiên, cho dù chúng là SQL thô hay không. Điều này đảm bảo rằng các truy vấn được quản lý đúng bởi một giao dịch , cho phép nhiều truy vấn trong cùng một yêu cầu được cam kết hoặc khôi phục dưới dạng một đơn vị. Đi ra ngoài giao dịch bằng cách sử dụng công cụ hoặc kết nối sẽ khiến bạn có nguy cơ tinh vi cao hơn, khó có thể phát hiện ra các lỗi có thể khiến bạn bị hỏng dữ liệu. Mỗi yêu cầu chỉ được liên kết với một giao dịch và việc sử dụng db.session
sẽ đảm bảo đây là trường hợp cho ứng dụng của bạn.
Cũng lưu ý rằng execute
được thiết kế cho các truy vấn tham số . Sử dụng các tham số, như :val
trong ví dụ, cho bất kỳ đầu vào nào cho truy vấn để bảo vệ bạn khỏi các cuộc tấn công tiêm nhiễm SQL. Bạn có thể cung cấp giá trị cho các tham số này bằng cách chuyển một dict
đối số thứ hai, trong đó mỗi khóa là tên của tham số như xuất hiện trong truy vấn. Cú pháp chính xác của chính tham số có thể khác nhau tùy thuộc vào cơ sở dữ liệu của bạn, nhưng tất cả các cơ sở dữ liệu quan hệ chính đều hỗ trợ chúng ở một số dạng.
Giả sử nó là một SELECT
truy vấn, điều này sẽ trả về một lần lặp của RowProxy
các đối tượng.
Bạn có thể truy cập các cột riêng lẻ với nhiều kỹ thuật khác nhau:
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
Cá nhân, tôi thích chuyển đổi kết quả thành 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)
Nếu bạn không sử dụng tiện ích mở rộng Flask-SQLAlchemy, bạn vẫn có thể dễ dàng sử dụng phiên:
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})