کار با Cursor در پایتون: استفاده از Cursor و مدیریت کوئریها در دیتابیس
فهرست مطالب این نوشته
Toggleپایتون برای کاربردهای مختلفی مورد استفاده قرار میگیرد؛ از توسعهی وب و هوش مصنوعی گرفته تا خودکارسازی کارهای ساده و مدیریت پایگاه دادهها. یکی از مهمترین کاربردهای پایتون، ارتباط با دیتابیس و مدیریت اطلاعات ذخیرهشده در آن است. برای اینکه بتوانید دادهها را از یک پایگاه داده بخوانید، تغییر دهید یا تحلیل کنید، باید اول از همه بدانید چطور با Cursor در پایتون کار کنید. این یعنی بلد باشید چطور به دیتابیس وصل شوید، اطلاعات را واکشی کنید و تغییراتتان را ذخیره یا لغو کنید.

تعریف و نقش Cursor در پایتون
Cursor در پایتون نمایندهی اجرایی دستورات SQL شما است. این شیء میان اتصال دیتابیس و کد شما قرار میگیرد و متدهایی مثل execute()، fetchall() و commit() را فراهم میکند. به کمک همین شیء است که شما میتوانید اطلاعات را وارد پایگاه داده کنید، بخوانید، یا ساختار جداول را تغییر دهید.
در پکیج sqlite3 از Sqlite در پایتون (که بخشی از کتابخانه استاندارد پایتون است)، ساخت کرسر به سادگی زیر انجام میشود:
import sqlite3
conn = sqlite3.connect(“data.db”)
cur = conn.cursor()
و اگر با MySQL کار میکنید، ابتدا باید کتابخانهی مربوط را نصب کنید:
pip install mysql-connector-python
سپس:
from mysql.connector import connect
conn = connect(
host=’localhost’,
user=’root’,
password=’your_password’,
database=’your_db’
)
cur = conn.cursor(dictionary=True)
بدین شکل میتوانید به سادگی به پایگاه دادهتان متصل شوید و با استفاده از Cursor، دستورات SQL را اجرا کنید یا نتایج را واکشی نمایید.
کاربرد Cursor در پایتون چیست؟
شاید بپرسید اصلاً چرا باید با Cursor در پایتون کار کنیم؟ پاسخ را میتوانیم خیلی خلاصه بگوییم: چون همهچیز از آن میگذرد. کرسر وظیفه دارد تا کوئریهای شما را به سرور پایگاه داده منتقل کند و سپس نتایج را برگرداند. شما با آن تراکنشها را کنترل میکنید، خطاها را مدیریت میکنید و دادهها را واکشی یا ثبت میکنید.
آموزش شی مکان نما MySQL در پایتون (همان کرسرها)
زمانی که با MySQL کار میکنید، کرسرها کمی پیشرفتهتر میشوند. برای مثال میتوانید از dictionary=True استفاده کنید تا نتایج به جای tuple، به صورت دیکشنری بازگردند. این کار خوانایی دادهها را بالا میبرد:
cur = conn.cursor(dictionary=True)
شما میتوانید از متدهای مختلف برای واکشی داده استفاده کنید: fetchone()، fetchmany() و fetchall(). به طور خاص، استفاده از Fetchall در پایتون برای خواندن تمام ردیفها در یک مرحله است، اما اگر حجم دادهها زیاد باشد، امکان دارد حافظهتان پر شود. در این موارد، fetchmany(size=1000) گزینهی بهتری است.
اجرای کوئریها با Cursor در پایتون
برای اجرا کردن دستورات SQL در پایتون، شما باید از طریق Cursor این کار را انجام دهید. در این بخش یاد میگیرید که چطور کوئریها را بنویسید، چطور آنها را اجرا کنید و چه تفاوتی میان execute() و executemany() وجود دارد.
متد execute و executemany
فرض کنید میخواهید ۱۰ رکورد را وارد جدول کنید. استفاده از execute برای هر کدام باعث کندی میشود. در مقابل، با executemany() میتوانید همه را یکجا وارد کنید:
query = “INSERT INTO movies (title, release_year) VALUES (%s, %s)”
data = [(“Inception”, 2010), (“Interstellar”, 2014), …]
cur.executemany(query, data)
conn.commit()
اگر میخواهید عملکرد کدتان در حجمهای بالا بهبود پیدا کند، قطعاً باید executemany را یاد بگیرید. تستها نشان دادهاند که این متد تا ۵ برابر سریعتر از اجرای مکرر execute() عمل میکند.
مدیریت تراکنشها با Cursor در پایتون
در بسیاری از پروژههای واقعی، باید مطمئن باشید که عملیاتهای حساس فقط در صورت موفقیت کامل انجام میشوند. برای این کار، از commit و rollback استفاده میکنیم:
try:
cur.execute(“UPDATE users SET active = 1 WHERE id = %s”, (user_id,))
conn.commit()
except:
conn.rollback()
همچنین میتوانید از context manager استفاده کنید تا کدتان تمیزتر و امنتر شود:
with conn.cursor() as cur:
cur.execute(“…”)
cur.execute(“…”)
conn.commit()
واکشی نتایج و پاکسازی درست با Cursor
بسیاری از برنامهنویسان تازهکار هنگام استفاده از کرسرها به خطای Unread result found برخورد میکنند. این اتفاق زمانی میافتد که شما یک بخشی از نتایج را واکشی کردهاید اما باقیمانده را فراموش کردهاید.
راهحل ساده است: یا fetchall() را کامل انجام دهید یا کرسر را ببندید.
در MySQL نیز اگر چند کوئری پشتسرهم اجرا میکنید (multi=True)، باید پس از هر کدام، fetchall() بزنید.
کوئریهای پیچیده و JOIN در پایتون
وقتی به مرحلهای رسیدید که میخواهید دادهها را تحلیل کنید، ترکیب Cursor در پایتون با JOIN و GROUP BY قدرت واقعی SQL را به شما نشان میدهد:
query = “””
SELECT title, AVG(rating) AS avg_rating
FROM ratings
JOIN movies ON movies.id = ratings.movie_id
GROUP BY movie_id
HAVING avg_rating > 8.5
ORDER BY avg_rating DESC
“””
cur.execute(query)
for row in cur.fetchall():
print(row)
این موضوع، بخشی از آموزش پایتون متوسط است و در ساخت گزارشها و داشبوردهای اطلاعاتی بسیار کاربرد دارد.
امنیت: جلوگیری از SQL Injection
یک اشتباه مرگبار در برنامهنویسی پایگاه داده، الصاق مستقیم ورودی کاربر به کوئری است. راه درست، استفاده از placeholderهاست:
# اشتباه
query = f”DELETE FROM users WHERE id = {user_input}”
# درست
query = “DELETE FROM users WHERE id = %s”
cur.execute(query, (user_input,))
جمعبندی
کرسر وسیلهای است که تقریباً تمام ارتباطهای شما با دیتابیس از طریق آن انجام میشود. چه بخواهید اطلاعات را وارد کنید، بخوانید، بهروزرسانی کنید یا حذف کنید، بدون کرسر عملاً هیچ کاری از پیش نمیرود. دانستن روش درست استفاده از Cursor در پایتون، هم کد شما را ایمنتر میکند و هم خواناتر. بدون آن، هیچ کدام از قابلیتهای SQL در پایتون قابل استفاده نخواهد بود.
برای یادگیری مفاهیم سطحی و عمیق پایتون با متدهای عملی و پروژهمحور، آکادمی چابک در کنار شماست. ما در حوزهی آموزش تخصصی برنامهنویسی، دیتابیس، توسعهی کسبوکارهای دیجیتال و مهارتهای فنی مورد نیاز بازار کار، دورههایی برگزار میکنیم که به شما کمک میکند در کمترین زمان، بیشترین پیشرفت را داشته باشید. برای اطلاعات بیشتر درباره دورههای آکادمی چابک، همین الان تماس بگیرید.
منبع:


دیدگاهتان را بنویسید