متد ()where برابر با عبارت شرطی WHERE در زبان SQL است و در این مطلب می خواهیم با مثال های ساده کاربرد این متد را نشان دهیم. توجه کنید این متد باید به انتهای متد ()select چسبانده شود و هرگز نباید آنرا درون متد ()slect به کار ببرید. همچنین نام ستون ها همانند آنچه که پیش از این گفتیم، بوسیله خصوصیت c قابل دسترسی هستند. همچنین در این مطلب می خواهیم متد دیگری به نام ()fetchall را به شما یاد دهیم.

در کد زیر می خواهیم تعداد تمامی کارمندانی را پیدا کنیم که نام آنها Zito باشد. روند کار همانند مطلب هایی است که پیش از این آموزش داده بودیم. ابتدا بوسیله متد ()select رشته کوئری آماده و در متغیری ذخیره می شود و سپس این متغیر به متد ()conn.execute فرستاده می شود. نتیجه که بر اساس کوئری میتواند شامل یک یا چندین سطر یا حتی صفر سطر باشد، در متغیری ذخیره می شود. مطابق شکل زیر می بینید که نوع متغیر rows که نتیجه ()conn.execute را در خود نگه می دارد، از کلاس ResultProxy است که این کلاس در زیر ماژول sqlalchemy.engine.result تعریف شده است.

متد ()fetchall در SqlAlchemy

مطابق کدهای بالا، خروجی conn.execute از کلاس ResultProxy است و همچنین متد ()fetchall بوسیله شی rows (از نوع کلاس ResultProxy) قابل دسترسی است. این متد از API های پایگاه داده به ماژول SqlAlchemy آمده است و هدف آن این است که یکباره تمامی سطرهای واکشی شده را به درون یک متغیر دیگری به نام count ذخیره شده است.

متغیر count از نوع آن لیست پایتون است، پس می توانیم تمامی سطرهای آن را بوسیله یک حلقه for نمایش دهیم و یا همانند خط پایانی کدهای بالا، تعداد عناصر آن را بوسیله متد ()len نمایش دهیم. به عبارت دیگر پیغام متد ()print در خط پایانی، برابر با تعداد کارمندانی است که نام آنها Zito است.

یک نکته مهم در مورد متد ()fetchall وجود دارد و آن اینکه اگر پس از فراخوانی آن و بارگذاری سطرها درون متغیر (در اینجا count) دیگر نمی توانید از آن برای دسترسی به متدها کمک بگیرید و به عبارت دیگر از این پس (و طبق این مطلب) شما تنها می توانید از متغیر count برای دسترسی به سطرهای واکشی شده کمک بگیرید. در واقع پس از فراخوانی مجدد ()fetchall برای کوئری پیشین (و نه یک کوئری تازه)، همانند شکل زیر می بینید که یک لیست خالی برگشت داده شده است.

عبارت های AND و OR در SqlAlchemy

فرض کنید می خواهید اطلاعات کارمندی به نام Zito و با شناسه کارمندی 499996 را پیدا کنید. چون شناسه کارمندی (emp_no) کلید اصلی است، پس تنها باید یک سطر برگشت داده شود. همینطور دو شر باید در نظر گرفته شوند، نسخت نام کارمند Zito و شناسه کارمندی آن 499996 باشدپس مطابق با زبان SQL باید عبارت AND در شرط WHERE به کار گرفته شود. در پایتون دو عملگر and و or وجود دارند که در کد زیر از عملگر and پایتون برای پیاده سازی عبارت AND زبان SQL کمک گرفته شده است.

ولی اگر به شکل بالا نگاه کنید می بینید که عبارت AND در رشته کوئری ایجاد شده، وجود ندارد، پس نتیجه اجرای کوئری آن چیزی نیست که ما انتظار داشتیم که تنها یک سطر برگشت داده شود. پس نتیجه می گیریم عملگرهای and و or در پایتون قابل به کار گیری در متد ()where از SqlAlchemy نیستند.

در SqlAlchemy دو متد ()and_ و ()or_ وجود دارند که به ترتیب برابر با عبارت های AND و OR در زبان SQL هستند و برای این در انتهای انها یک زیر خط (Underline) وجودارد، زیرا از تداخل با عملگرهای and و or پایتون جلوگیری شودکد و شکل زیر بازنویسی شده کوئری بالا است به طوری که می بینید هم رشته کوئری درست ایجاد شده است و هم نتیجه دلخواه ما برگشت داده شده است. نکنته دیگر اینکه ما از متد دیگری به نام ()fetchone کمک گرفته ایم.

متد  ()fetchone در SqlAlchemy

متد ()fetchone همانند ()fetchall بوسیله شی از کلاس ResultProxy قابل دسترسی است. کاربرد ()fetchone واکشی یک سطر و احتمالا در صورت نیاز ذخیره سازی آن درون یک متغیر (در کد بالا emp) است. توجه کنید همانند آنچه که برای ()fetchall گفتیم، پس از فراخوانی مجدد متد ()fetchone برای کوئری پیشین، دیگر داده های قابل دسترسی نیست.

متد  ()fetchmany در SqlAlchemy

متد ()fetchmany همانند ()fetchall بوسیله شی از کلاس ResultProxy قابل دسترسی است. از متد ()fetchmany برای واکشی چندین سطر  دلخواه کمک گرفته می شود، بنابراین عدد صحیح به متد فرستاده می شود، که برابر است با تعداد سطرهای دلخواه است. توجه کنید همانند آنچه که برای ()fetchall گفتیم، پس از فراخوانی مجدد متد ()fetchone برای کوئری پیشین، دیگر داده های قابل دسترسی نیست.