এসকিউএল আলকেমি সেশন অবজেক্টগুলির নিজস্ব execute
পদ্ধতি রয়েছে:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
আপনার সমস্ত অ্যাপ্লিকেশন প্রশ্নগুলি কাঁচা এসকিউএল কিনা তা সেশন অবজেক্টের মধ্য দিয়ে যাওয়া উচিত। এটি নিশ্চিত করে যে ক্যোয়ারীগুলি কোনও লেনদেনের মাধ্যমে সঠিকভাবে পরিচালিত হয়েছে , যা একই অনুরোধে একাধিক প্রশ্নের প্রতিশ্রুতিবদ্ধ বা একক ইউনিট হিসাবে ফিরে যেতে সহায়তা করে। ইঞ্জিন বা সংযোগ ব্যবহার করে লেনদেনের বাইরে যাওয়া আপনাকে সূক্ষ্মতার অনেক বেশি ঝুঁকিতে ফেলে, সম্ভবত ত্রুটিযুক্ত ডেটা দিয়ে আপনাকে ছেড়ে দিতে পারে এমন বাগগুলি সনাক্ত করা খুব শক্ত। প্রতিটি অনুরোধটি কেবল একটি লেনদেনের সাথে জড়িত হওয়া উচিত এবং এটি ব্যবহার করা db.session
আপনার আবেদনের ক্ষেত্রে নিশ্চিত হবে ensure
প্যারামিটারাইজড কোয়েরিগুলিরexecute
জন্য ডিজাইন করা হয়েছে তাও নোট করুন । :val
এসকিউএল ইঞ্জেকশন আক্রমণ থেকে নিজেকে রক্ষা করতে কোয়েরিতে থাকা কোনও ইনপুটগুলির জন্য উদাহরণস্বরূপ প্যারামিটারগুলি ব্যবহার করুন । আপনি এই প্যারামিটারগুলির জন্য dict
দ্বিতীয় আর্গুমেন্ট হিসাবে মান প্রদান করতে পারেন , যেখানে প্রতিটি কী প্যারামিটারের নাম যা ক্যোয়ারীতে প্রদর্শিত হবে। প্যারামিটারের সঠিক বাক্য গঠন নিজেই আপনার ডাটাবেসের উপর নির্ভর করে ভিন্ন হতে পারে, তবে সমস্ত প্রধান রিলেশনাল ডাটাবেসগুলি কোনও না কোনও আকারে তাদের সমর্থন করে।
ধরে নেওয়া যাক এটি একটি এর SELECT
ক্যোয়ারী, এই ফিরে আসবে একটি iterable এর RowProxy
অবজেক্ট।
আপনি বিভিন্ন কৌশল সহ পৃথক কলামগুলি অ্যাক্সেস করতে পারেন:
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
ব্যক্তিগতভাবে, আমি ফলাফলগুলিকে এসগুলিতে রূপান্তর করতে পছন্দ করি namedtuple
:
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)
আপনি যদি ফ্লাস্ক-এসকিউএএলএলএকএলএমই এক্সটেনশন ব্যবহার করছেন না, আপনি এখনও সহজেই একটি সেশন ব্যবহার করতে পারেন:
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})