Syntax | سینتکس
3.01K subscribers
410 photos
108 videos
35 files
378 links
Download Telegram
متد iterator در django orm

در Django ORM، متد iterator() یک ابزار کارآمد برای پردازش مجموعه‌های داده بزرگ است. این متد یک ایتراتور (iterator) را برمی‌گرداند که می‌توانید آن را برای دسترسی تدریجی به رکوردهای جدول استفاده کنید. این روش در مقایسه با متدهای معمولی مانند all() یا values() که تمام رکوردها را یکباره در حافظه بارگذاری می‌کنند، کارآمدتر است.

مثال کاربردی:
فرض کنید می‌خواهید یک فایل CSV را از رکوردهای یک جدول در پایگاه داده پر کنید. اگر تعداد رکوردها بسیار زیاد باشد، بارگذاری همه آنها در حافظه ممکن است باعث مشکلات مربوط به مصرف حافظه شود. در چنین مواردی، می‌توانید از iterator() استفاده کنید تا رکوردها را به صورت تدریجی پردازش کنید.

from django.core.files import File
from myapp.models import MyModel

# باز کردن فایل CSV برای نوشتن
csv_file = open('data.csv', 'w')

# نوشتن سرآیند (headers) در فایل CSV
csv_file.write('field1,field2,field3\n')

# استفاده از iterator() برای دسترسی تدریجی به رکوردها
for obj in MyModel.objects.iterator():
# نوشتن هر رکورد در فایل CSV
csv_file.write(f'{obj.field1},{obj.field2},{obj.field3}\n')

# بستن فایل CSV
csv_file.close()


در این مثال، ما از MyModel.objects.iterator() برای دریافت یک ایتراتور استفاده می‌کنیم. سپس با یک حلقه `for`، هر رکورد را به صورت تدریجی پردازش می‌کنیم و آن را در فایل CSV می‌نویسیم.

مزایای استفاده از iterator():

1. کارآمدی حافظه: رکوردها به صورت تدریجی در حافظه بارگذاری می‌شوند، بنابراین حافظه کمتری مصرف می‌شود.
2. پردازش تدریجی: می‌توانید رکوردها را یکی یکی پردازش کنید، بدون نیاز به بارگذاری همه آنها در حافظه.
3. سرعت بالا: معمولاً سریعتر از بارگذاری همه رکوردها در حافظه و سپس پردازش آنهاست.

توجه داشته باشید که iterator() فقط یک بار قابل استفاده است و پس از پایان حلقه، دیگر قابل استفاده نیست. همچنین، شما نمی‌توانید از فیلترها یا سورت‌کردن رکوردها با iterator() استفاده کنید. برای این کارها، باید ابتدا یک QuerySet معمولی ایجاد کنید و سپس از iterator() روی آن استفاده کنید.


وقتی از iterator استفاده می کنیم، سمت دیتابیس چه اتفاقی می افتد؟

زمانی که از iterator() در Django ORM استفاده می‌کنید، Django در سمت پایگاه داده یک "Server-side Cursor" را ایجاد می‌کند. این کارسر (Cursor) در واقع یک ابزار در سمت سرور پایگاه داده است که به شما امکان می‌دهد رکوردها را یکی یکی و به صورت تدریجی از پایگاه داده بخوانید، بدون اینکه نیاز باشد همه رکوردها را یکباره در حافظه بارگذاری کنید.

فرآیند کار با Server-side Cursor به این شرح است:

1. ایجاد کارسر: زمانی که از iterator() استفاده می‌کنید، Django یک درخواست SQL برای ایجاد یک کارسر در سمت سرور پایگاه داده ارسال می‌کند.

2. اجرای درخواست: سرور پایگاه داده درخواست SQL را اجرا می‌کند و یک کارسر ایجاد می‌کند که به صورت تدریجی می‌تواند رکوردها را بازیابی کند.

3. بازیابی تدریجی رکوردها: در هر بار که در حلقه for به رکورد بعدی می‌رسید، Django از طریق کارسر ایجاد شده، درخواست بازیابی رکورد بعدی را به سرور پایگاه داده ارسال می‌کند.

4. دریافت رکورد: سرور پایگاه داده رکورد بعدی را از طریق کارسر بازیابی می‌کند و آن را به Django برمی‌گرداند.

5. تکرار گام 3 و 4: این فرآیند تا زمانی که همه رکوردها بازیابی شوند یا حلقه for متوقف شود، ادامه می‌یابد.

6. بستن کارسر: پس از اتمام حلقه، Django درخواست بستن کارسر را به سرور پایگاه داده ارسال می‌کند.

استفاده از Server-side Cursor به این معنی است که رکوردها به صورت تدریجی از پایگاه داده بازیابی می‌شوند، بدون اینکه نیاز باشد همه آنها یکباره در حافظه لود شوند. این امر باعث صرفه‌جویی در مصرف حافظه و افزایش کارایی می‌شود، به ویژه زمانی که با مجموعه‌های داده بزرگ سروکار دارید.

#django #cursor

@Syntax_fa
👍11