آموزش Tortoise ORM

آموزش Tortoise ORM

آموزش Tortoise orm
برنامه نویسی پایگاه داده مهندسی نرم افزار

آموزش Tortoise ORM

اگر به توسعه بک‌اند با پایتون علاقه‌مند هستید و می‌خواهید با یک ORM مدرن، سبک و مناسب برنامه‌های
asynchronous کار کنید، Tortoise ORM یکی از گزینه‌های بسیار خوب برای شماست.
در این مقاله، به صورت جامع و سئو فرندلی، ابتدا مفاهیم پایه‌ای مرتبط با ORM را بررسی می‌کنیم، سپس
خود Tortoise ORM را به صورت مفصل معرفی خواهیم کرد و در ادامه، کوئری‌های رایج و ساده را
قدم‌به‌قدم آموزش می‌دهیم.

هدف این آموزش فلسک دولوپر این است که بعد از مطالعه آن، بتوانید مدل بسازید، به دیتابیس متصل شوید، داده ثبت کنید،
رکوردها را بخوانید، ویرایش کنید، حذف کنید و فیلترهای پرکاربرد را در پروژه‌های واقعی استفاده نمایید.

فهرست مطالب

ORM چیست و چرا اهمیت دارد؟

ORM مخفف Object Relational Mapping است. به زبان ساده، ORM ابزاری است که به شما اجازه
می‌دهد به جای نوشتن مستقیم کوئری‌های SQL، با استفاده از کلاس‌ها و آبجکت‌های پایتون با دیتابیس کار کنید.

در دیتابیس رابطه‌ای، اطلاعات در قالب جدول، سطر و ستون ذخیره می‌شوند. اما در برنامه‌نویسی شی‌گرا،
داده‌ها معمولاً به شکل کلاس و آبجکت تعریف می‌شوند. ORM این دو دنیا را به هم متصل می‌کند:

  • هر Table در دیتابیس معمولاً معادل یک Model در کد است.
  • هر Row معادل یک Object یا نمونه از آن مدل است.
  • هر Column معادل یک Field در مدل است.

مزیت ORM این است که خوانایی کد بیشتر می‌شود، توسعه سریع‌تر انجام می‌گیرد و نگهداری پروژه در بلندمدت
راحت‌تر خواهد بود. همچنین معمولاً ORMها امکاناتی مثل اعتبارسنجی، مدیریت رابطه‌ها، فیلتر کردن، مرتب‌سازی
و عملیات CRUD را ساده‌تر می‌کنند.

چرا به جای SQL مستقیم از ORM استفاده می‌کنیم؟

  • کد تمیزتر و خواناتر می‌شود.
  • سرعت توسعه بالاتر می‌رود.
  • مدیریت مدل‌ها و رابطه‌ها ساده‌تر می‌شود.
  • امکان استفاده مجدد از کد بیشتر است.
  • در بسیاری از موارد، وابستگی به دیتابیس خاص کمتر می‌شود.

البته این به معنی بی‌نیاز شدن کامل از SQL نیست. هر توسعه‌دهنده بک‌اند بهتر است مفاهیم SQL را هم بداند،
چون درک عملکرد واقعی ORM بدون شناخت دیتابیس کامل نخواهد بود.

مفاهیم پایه‌ای دیتابیس و مدل‌سازی

قبل از شروع کار با Tortoise ORM، بهتر است چند مفهوم مهم را مرور کنیم. این مفاهیم تقریباً در همه ORMها
و دیتابیس‌های رابطه‌ای مشترک هستند.

مدل یا Model

مدل در ORM، نمایش برنامه‌نویسی‌شده یک جدول در دیتابیس است. برای مثال اگر در سیستم خود جدول
users داشته باشید، معمولاً یک مدل به نام User تعریف می‌کنید.

فیلد یا Field

هر ویژگی مدل که قرار است در دیتابیس ذخیره شود، یک فیلد است. مثلاً نام، ایمیل، سن، تاریخ ایجاد و غیره.

کلید اصلی یا Primary Key

هر جدول معمولاً یک ستون اصلی دارد که هر رکورد را به صورت یکتا شناسایی می‌کند. در بسیاری از موارد،
فیلد id به عنوان کلید اصلی استفاده می‌شود.

روابط بین جداول

در پروژه‌های واقعی معمولاً داده‌ها فقط در یک جدول ذخیره نمی‌شوند. برای همین روابط بین مدل‌ها اهمیت زیادی دارند:

  • One to Many: مثلاً یک کاربر می‌تواند چند مقاله داشته باشد.
  • ForeignKey: برای پیاده‌سازی رابطه بین دو مدل استفاده می‌شود.
  • Many to Many: مثلاً یک مقاله می‌تواند چند برچسب داشته باشد و هر برچسب هم در چند مقاله باشد.
  • One to One: مثلاً هر کاربر فقط یک پروفایل اختصاصی داشته باشد.

عملیات CRUD

CRUD چهار عملیات اصلی روی داده‌ها را شامل می‌شود:

  • Create: ایجاد داده جدید
  • Read: خواندن داده‌ها
  • Update: بروزرسانی داده‌ها
  • Delete: حذف داده‌ها

بخش زیادی از کار روزمره شما با ORM، همین عملیات CRUD و انواع فیلترهای مرتبط با آن خواهد بود.

Tortoise ORM چیست؟

Tortoise ORM یک ORM سبک، مدرن و asynchronous برای زبان پایتون است که با الهام از
Django ORM طراحی شده، اما تمرکز آن بیشتر روی محیط‌های async مثل FastAPI، Sanic،
Quart و دیگر فریم‌ورک‌های مبتنی بر async است.

اگر با Django ORM کار کرده باشید، هنگام استفاده از Tortoise ORM بسیاری از مفاهیم برایتان آشنا خواهد بود.
اما تفاوت مهم اینجاست که Tortoise ORM به صورت طبیعی برای اجرای عملیات غیرهمزمان طراحی شده است.

منظور از asynchronous چیست؟

در برنامه‌های async، عملیات‌هایی مثل ارتباط با دیتابیس، فایل یا شبکه می‌توانند بدون بلاک کردن کل برنامه
انجام شوند. این موضوع مخصوصاً در APIها و سرویس‌های وب با تعداد درخواست بالا بسیار مفید است.

به همین دلیل، Tortoise ORM انتخاب خوبی برای توسعه‌دهندگانی است که از ساختار async/await در پایتون استفاده می‌کنند.

ویژگی‌های مهم Tortoise ORM

  • پشتیبانی از async/await
  • تعریف مدل‌ها به شکل ساده و خوانا
  • پشتیبانی از رابطه‌ها بین مدل‌ها
  • کار با دیتابیس‌های مختلف مانند SQLite، PostgreSQL و MySQL
  • کوئری‌نویسی ساده و شبیه به ORMهای محبوب
  • امکان استفاده از migration با ابزارهایی مانند Aerich

مزایا و کاربردهای Tortoise ORM

Tortoise ORM برای بسیاری از پروژه‌های مدرن پایتونی مناسب است، مخصوصاً زمانی که:

  • از FastAPI استفاده می‌کنید.
  • به ORM سبک‌تر از Django ORM نیاز دارید.
  • پروژه شما async است.
  • می‌خواهید کوئری‌ها را به شکل شی‌گرا و خوانا بنویسید.

مهم‌ترین مزیت آن این است که توسعه را سریع و تمیز می‌کند. شما به جای درگیری با جزئیات SQL در مراحل ابتدایی،
روی منطق پروژه تمرکز می‌کنید. البته هر زمان لازم باشد، شناخت SQL همچنان ارزشمند است.

نصب Tortoise ORM و پیش‌نیازها

برای شروع، باید پکیج Tortoise ORM را نصب کنید. اگر می‌خواهید از SQLite استفاده کنید، معمولاً راه‌اندازی
ساده‌تر است و برای آموزش هم گزینه مناسبی محسوب می‌شود.

pip install tortoise-orm

اگر در آینده قصد استفاده از migration داشته باشید، معمولاً ابزار Aerich هم نصب می‌شود:

pip install aerich

در این مقاله، تمرکز اصلی ما روی یادگیری مفاهیم و کوئری‌های ساده و رایج است، بنابراین وارد جزئیات عمیق migration
نمی‌شویم؛ اما در حد لازم به آن اشاره خواهیم کرد.

راه‌اندازی اولیه پروژه

برای شروع، یک ساختار ساده در نظر می‌گیریم:

project/
├── main.py
└── models.py

در فایل models.py مدل‌ها را تعریف می‌کنیم و در فایل main.py اتصال به دیتابیس
و اجرای کوئری‌ها را انجام می‌دهیم.

ساخت مدل‌ها در Tortoise ORM

بیایید با یک مدل ساده به نام User شروع کنیم. این مدل شامل نام، ایمیل، سن و وضعیت فعال بودن است.

from tortoise import fields, models

class User(models.Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=100)
    email = fields.CharField(max_length=255, unique=True)
    age = fields.IntField(null=True)
    is_active = fields.BooleanField(default=True)
    created_at = fields.DatetimeField(auto_now_add=True)

    def __str__(self):
        return self.name

توضیح فیلدها

  • IntField: برای اعداد صحیح
  • pk=True: این فیلد کلید اصلی است
  • CharField: برای رشته‌های کوتاه
  • unique=True: مقدار این فیلد باید یکتا باشد
  • null=True: این فیلد می‌تواند مقدار نداشته باشد
  • BooleanField: برای مقدار درست/نادرست
  • DatetimeField(auto_now_add=True): زمان ایجاد رکورد را به صورت خودکار ثبت می‌کند

همین ساختار ساده نشان می‌دهد که Tortoise ORM چقدر در تعریف مدل‌ها خوانا و قابل فهم عمل می‌کند.

اتصال به دیتابیس و مقداردهی اولیه

اکنون باید Tortoise ORM را به دیتابیس متصل کنیم. برای شروع از SQLite استفاده می‌کنیم.

import asyncio
from tortoise import Tortoise

async def init():
    await Tortoise.init(
        db_url="sqlite://db.sqlite3",
        modules={"models": ["models"]}
    )
    await Tortoise.generate_schemas()

asyncio.run(init())

این کد چه کاری انجام می‌دهد؟

  • Tortoise.init: اتصال اولیه به دیتابیس را برقرار می‌کند.
  • db_url: آدرس دیتابیس را مشخص می‌کند.
  • modules: مشخص می‌کند مدل‌ها در کدام ماژول قرار دارند.
  • generate_schemas: جدول‌ها را بر اساس مدل‌ها می‌سازد.

توجه کنید که generate_schemas بیشتر برای محیط توسعه و آموزش مناسب است. در پروژه‌های واقعی،
بهتر است از migration استفاده شود.

آموزش CRUD در Tortoise ORM

حالا به بخش مهم آموزش می‌رسیم؛ یعنی انجام عملیات اصلی روی داده‌ها.

Create: ایجاد رکورد جدید

ساده‌ترین روش برای ایجاد یک کاربر جدید:

from models import User

user = await User.create(
    name="Ali",
    email="ali@example.com",
    age=25
)

در اینجا، متد create یک رکورد جدید در جدول کاربران ایجاد می‌کند و همان آبجکت ذخیره‌شده را برمی‌گرداند.

روش دیگر برای ایجاد و سپس ذخیره

user = User(name="Sara", email="sara@example.com", age=22)
await user.save()

این روش زمانی مفید است که بخواهید قبل از ذخیره‌سازی، روی آبجکت عملیات دیگری انجام دهید.

Read: خواندن داده‌ها

برای دریافت همه کاربران:

users = await User.all()

برای دریافت فقط یک کاربر بر اساس شناسه:

user = await User.get(id=1)

اگر رکورد پیدا نشود، متد get خطا می‌دهد. به همین دلیل، گاهی روش امن‌تر این است:

user = await User.filter(id=1).first()

اگر کاربری با این شناسه وجود نداشته باشد، مقدار None برمی‌گردد.

Update: ویرایش رکورد

ابتدا رکورد را دریافت می‌کنیم، سپس مقدار را تغییر می‌دهیم و ذخیره می‌کنیم:

user = await User.get(id=1)
user.age = 30
await user.save()

روش دیگر، آپدیت مستقیم با کوئری است:

await User.filter(id=1).update(age=31)

این روش برای آپدیت سریع و مستقیم بسیار کاربردی است.

Delete: حذف رکورد

حذف یک کاربر بعد از دریافت آبجکت:

user = await User.get(id=1)
await user.delete()

یا حذف مستقیم با فیلتر:

await User.filter(id=1).delete()

کوئری‌های ساده و رایج در Tortoise ORM

حالا که عملیات اصلی را یاد گرفتید، وقت آن است با کوئری‌های رایج و روزمره آشنا شوید. این بخش برای استفاده
واقعی از Tortoise ORM بسیار مهم است.

دریافت همه رکوردها

users = await User.all()

فیلتر بر اساس یک شرط

active_users = await User.filter(is_active=True)

فیلتر با چند شرط

users = await User.filter(is_active=True, age=25)

دریافت اولین رکورد

user = await User.filter(is_active=True).first()

دریافت آخرین رکورد

user = await User.all().last()

مرتب‌سازی صعودی

users = await User.all().order_by("age")

مرتب‌سازی نزولی

users = await User.all().order_by("-age")

محدود کردن تعداد نتایج

users = await User.all().limit(5)

رد کردن تعدادی از نتایج

users = await User.all().offset(10)

ترکیب limit و offset برای صفحه‌بندی

users = await User.all().offset(0).limit(10)

این الگو برای پیاده‌سازی pagination بسیار پرکاربرد است.

جستجو با contains

users = await User.filter(name__contains="Al")

جستجوی غیرحساس به حروف با icontains

users = await User.filter(name__icontains="ali")

شروع شدن با مقدار مشخص

users = await User.filter(email__startswith="admin")

پایان یافتن با مقدار مشخص

users = await User.filter(email__endswith="@gmail.com")

بزرگ‌تر و کوچک‌تر

users = await User.filter(age__gt=18)
users = await User.filter(age__lt=30)

بزرگ‌تر یا مساوی و کوچک‌تر یا مساوی

users = await User.filter(age__gte=18)
users = await User.filter(age__lte=30)

فیلتر در یک بازه

users = await User.filter(age__range=[20, 30])

فیلتر بر اساس چند مقدار با in

users = await User.filter(id__in=[1, 2, 3, 4])

بررسی تهی بودن مقدار

users = await User.filter(age__isnull=True)

برعکس کردن شرط با exclude

users = await User.exclude(is_active=True)

یعنی همه کاربرانی که فعال نیستند.

شمارش رکوردها

count = await User.all().count()

بررسی وجود داشتن رکورد

exists = await User.filter(email="ali@example.com").exists()

این متد مقدار بولی برمی‌گرداند و برای چک کردن وجود داده بسیار مفید است.

دریافت مقادیر خاص به جای کل آبجکت

users = await User.all().values("id", "name", "email")

خروجی این کوئری معمولاً لیستی از دیکشنری‌ها خواهد بود.

دریافت یک لیست تخت از یک فیلد

emails = await User.all().values_list("email", flat=True)

اگر فقط به یک ستون خاص نیاز دارید، این روش بسیار بهینه و کاربردی است.

کار با روابط بین مدل‌ها

در پروژه‌های واقعی، معمولاً فقط با یک مدل کار نمی‌کنید. بنابراین باید یاد بگیرید چگونه رابطه بین مدل‌ها
را در Tortoise ORM تعریف و استفاده کنید.

مثال: رابطه کاربر و مقاله

هر کاربر می‌تواند چند مقاله داشته باشد. این یعنی یک رابطه One to Many.

from tortoise import fields, models

class User(models.Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=100)
    email = fields.CharField(max_length=255, unique=True)

class Post(models.Model):
    id = fields.IntField(pk=True)
    title = fields.CharField(max_length=200)
    content = fields.TextField()
    user = fields.ForeignKeyField("models.User", related_name="posts")
    created_at = fields.DatetimeField(auto_now_add=True)

ساخت مقاله برای یک کاربر

user = await User.get(id=1)

post = await Post.create(
    title="آموزش Tortoise ORM",
    content="متن مقاله...",
    user=user
)

دریافت مقالات یک کاربر

user = await User.get(id=1)
posts = await user.posts.all()

در اینجا related_name=”posts” باعث شده از طریق user.posts به مقالات آن کاربر
دسترسی داشته باشیم.

دریافت مقاله به همراه اطلاعات کاربر

post = await Post.get(id=1).prefetch_related("user")

وقتی به رابطه‌ها نیاز دارید، استفاده درست از prefetch_related و select_related می‌تواند تعداد کوئری‌ها را کاهش دهد.

استفاده از select_related

post = await Post.get(id=1).select_related("user")

در رابطه‌های ForeignKey، این متد معمولاً برای بهینه‌سازی کوئری‌ها کاربرد زیادی دارد.

کوئری‌های کاربردی‌تر و روزمره

در این بخش، چند مثال واقعی‌تر از کوئری‌های رایج را می‌بینیم که در پروژه‌های روزمره زیاد استفاده می‌شوند.

دریافت کاربران فعال با سن بیشتر از 18 سال

users = await User.filter(is_active=True, age__gt=18)

دریافت 10 کاربر آخر

users = await User.all().order_by("-id").limit(10)

جستجوی کاربر بر اساس بخشی از نام یا ایمیل

users = await User.filter(name__icontains="ali")
users_by_email = await User.filter(email__icontains="gmail")

آپدیت گروهی کاربران غیرفعال

await User.filter(is_active=False).update(is_active=True)

حذف گروهی کاربران بدون سن

await User.filter(age__isnull=True).delete()

دریافت فقط نام و ایمیل کاربران فعال

users = await User.filter(is_active=True).values("name", "email")

چک کردن وجود ایمیل تکراری قبل از ثبت‌نام

email_exists = await User.filter(email="test@example.com").exists()

این نمونه در فرم ثبت‌نام بسیار پرکاربرد است.

دریافت یک کاربر یا None

user = await User.filter(email="ali@example.com").first()

اگر رکوردی پیدا نشود، None برمی‌گردد و برنامه بدون خطای شدید ادامه پیدا می‌کند.

استفاده از get_or_none

user = await User.get_or_none(email="ali@example.com")

این متد نیز برای دریافت امن یک رکورد بسیار مفید است.

استفاده از get_or_create

user, created = await User.get_or_create(
    email="new@example.com",
    defaults={"name": "New User", "age": 20}
)

اگر کاربر وجود داشته باشد، همان رکورد برگردانده می‌شود. در غیر این صورت، رکورد جدید ساخته می‌شود.
متغیر created مشخص می‌کند که رکورد جدید ساخته شده یا نه.

استفاده از bulk_create برای درج گروهی

users = [
    User(name="A", email="a@example.com", age=20),
    User(name="B", email="b@example.com", age=21),
    User(name="C", email="c@example.com", age=22),
]

await User.bulk_create(users)

زمانی که می‌خواهید تعداد زیادی رکورد را یکجا ثبت کنید، این روش بهتر از create در حلقه است.

استفاده از bulk_update برای بروزرسانی گروهی

users = await User.filter(id__in=[1, 2, 3])

for user in users:
    user.is_active = False

await User.bulk_update(users, fields=["is_active"])

نمونه کامل فایل main.py

برای درک بهتر، در ادامه یک مثال کامل و ساده می‌بینید که مقداردهی اولیه، ساخت داده، خواندن و فیلتر را
یکجا نشان می‌دهد.

import asyncio
from tortoise import Tortoise
from models import User

async def run():
    await Tortoise.init(
        db_url="sqlite://db.sqlite3",
        modules={"models": ["models"]}
    )
    await Tortoise.generate_schemas()

    await User.create(name="Ali", email="ali@example.com", age=25)
    await User.create(name="Sara", email="sara@example.com", age=22)
    await User.create(name="Reza", email="reza@example.com", age=31, is_active=False)

    all_users = await User.all()
    print("All users:", all_users)

    active_users = await User.filter(is_active=True)
    print("Active users:", active_users)

    young_users = await User.filter(age__lt=30).values("name", "age")
    print("Young users:", young_users)

    exists = await User.filter(email="ali@example.com").exists()
    print("Ali exists?", exists)

    user = await User.get_or_none(email="sara@example.com")
    if user:
        user.age = 23
        await user.save()

    await Tortoise.close_connections()

asyncio.run(run())

آشنایی با migration در Tortoise ORM

وقتی ساختار مدل‌ها در پروژه واقعی تغییر می‌کند، نباید هر بار از generate_schemas استفاده کنید،
چون این کار برای مدیریت تغییرات دیتابیس مناسب نیست. در اینجا migration اهمیت پیدا می‌کند.

برای Tortoise ORM معمولاً از ابزار Aerich استفاده می‌شود. این ابزار تغییرات مدل‌ها را مدیریت
می‌کند و اسکریپت‌های migration می‌سازد.

به صورت کلی، روند کار با Aerich شامل این مراحل است:

  • مقداردهی اولیه تنظیمات migration
  • ایجاد migration جدید بعد از تغییر مدل‌ها
  • اجرای migration روی دیتابیس

اگرچه جزئیات کامل migration موضوع یک مقاله جداگانه است، اما مهم است بدانید در پروژه‌های واقعی،
migration یک بخش ضروری از توسعه پایدار است.

بهترین روش‌ها و نکات مهم در کار با Tortoise ORM

1. همیشه مفاهیم دیتابیس را درک کنید

حتی اگر ORM کار شما را ساده می‌کند، باید بدانید پشت صحنه چه اتفاقی در دیتابیس می‌افتد. این موضوع برای
بهینه‌سازی و جلوگیری از کوئری‌های سنگین بسیار مهم است.

2. از get در جای درست استفاده کنید

اگر احتمال می‌دهید رکورد وجود نداشته باشد، به جای get از get_or_none یا
first استفاده کنید تا مدیریت خطا آسان‌تر شود.

3. فقط داده‌های مورد نیاز را دریافت کنید

اگر به همه فیلدها نیاز ندارید، از values و values_list استفاده کنید.
این کار هم خوانایی را بهتر می‌کند و هم می‌تواند عملکرد را بهبود دهد.

4. رابطه‌ها را بهینه بارگذاری کنید

برای جلوگیری از کوئری‌های اضافی، در رابطه‌ها از select_related و prefetch_related
استفاده کنید.

5. در پروژه‌های واقعی از migration استفاده کنید

استفاده مداوم از generate_schemas در پروژه واقعی پیشنهاد نمی‌شود. برای مدیریت تغییرات ساختار دیتابیس،
migration راه‌حل درست‌تری است.

6. اعتبارسنجی داده‌ها را فراموش نکنید

ORM مسئول همه اعتبارسنجی‌های تجاری شما نیست. برای مثال، در APIها یا فرم‌ها همچنان باید ورودی کاربر را
به درستی اعتبارسنجی کنید.

تفاوت Tortoise ORM با برخی ORMهای دیگر

برای درک بهتر جایگاه Tortoise ORM، خوب است آن را به صورت کلی با چند گزینه دیگر مقایسه کنیم.

Tortoise ORM و Django ORM

  • Django ORM به شدت بالغ و بسیار پرکاربرد است.
  • Tortoise ORM از نظر سبک نوشتار شباهت‌هایی به Django ORM دارد.
  • Tortoise ORM برای محیط‌های async مناسب‌تر است.
  • اگر از Django استفاده نمی‌کنید ولی سبک مدل‌نویسی آن را دوست دارید، Tortoise ORM گزینه خوبی است.

Tortoise ORM و SQLAlchemy

  • SQLAlchemy بسیار قدرتمند و منعطف است.
  • برای برخی افراد، شروع کار با Tortoise ORM ساده‌تر و سریع‌تر است.
  • Tortoise ORM برای پروژه‌هایی که سادگی و async بودن مهم است، انتخاب محبوبی محسوب می‌شود.

اشتباهات رایج هنگام کار با Tortoise ORM

  • فراموش کردن await در متدهای async
  • استفاده بی‌جا از get بدون مدیریت خطا
  • بارگذاری غیرضروری همه فیلدها و همه رکوردها
  • عدم درک تفاوت بین first، get و filter
  • نادیده گرفتن بهینه‌سازی رابطه‌ها
  • استفاده از generate_schemas در محیط production

سوالات متداول درباره Tortoise ORM

آیا Tortoise ORM برای FastAPI مناسب است؟

بله، یکی از کاربردهای رایج Tortoise ORM استفاده در کنار FastAPI است، چون هر دو با رویکرد async سازگار هستند.

آیا Tortoise ORM جایگزین Django ORM است؟

نه دقیقاً. Django ORM بخشی از اکوسیستم Django است، اما Tortoise ORM بیشتر برای پروژه‌های async و فریم‌ورک‌های
سبک‌تر کاربرد دارد.

آیا بدون دانستن SQL می‌توان با Tortoise ORM کار کرد؟

بله، برای شروع می‌توانید بدون SQL هم از آن استفاده کنید، اما برای توسعه حرفه‌ای و بهینه‌سازی، آشنایی با SQL
بسیار مهم است.

بهترین دیتابیس برای شروع آموزش Tortoise ORM چیست؟

برای آموزش و تمرین، SQLite بهترین گزینه است چون تنظیمات ساده‌ای دارد. برای پروژه‌های واقعی، معمولاً
PostgreSQL انتخاب بسیار خوبی محسوب می‌شود.

آیا Tortoise ORM از رابطه‌ها پشتیبانی می‌کند؟

بله، از انواع رابطه‌ها مانند ForeignKey، Many to Many و One to One پشتیبانی می‌کند.

جمع‌بندی

Tortoise ORM یک ORM مدرن، سبک و مناسب پروژه‌های async پایتونی است که یادگیری آن برای توسعه‌دهندگان
بک‌اند بسیار ارزشمند خواهد بود. در این مقاله، ابتدا مفاهیم پایه‌ای ORM و مدل‌سازی دیتابیس را توضیح دادیم،
سپس خود Tortoise ORM را معرفی کردیم و در ادامه، مهم‌ترین کوئری‌های ساده و رایج را قدم‌به‌قدم بررسی نمودیم.

اگر بخواهیم مهم‌ترین بخش‌های این آموزش را خلاصه کنیم:

  • مدل‌ها پایه کار در Tortoise ORM هستند.
  • عملیات CRUD بخش اصلی تعامل با داده‌ها را تشکیل می‌دهد.
  • متدهای filter، get، first، update، delete و exists بسیار پرکاربرد هستند.
  • رابطه‌ها و بهینه‌سازی کوئری‌ها در پروژه‌های واقعی اهمیت زیادی دارند.
  • برای پروژه‌های production بهتر است migration را جدی بگیرید.

اگر در حال یادگیری توسعه بک‌اند با پایتون هستید، تسلط روی Tortoise ORM می‌تواند سرعت توسعه شما را بالا ببرد
و کدهای شما را خواناتر و حرفه‌ای‌تر کند. پیشنهاد می‌شود بعد از مطالعه این مقاله، مثال‌ها را شخصاً اجرا کنید
و با تغییر فیلترها و کوئری‌ها، درک عملی خود را عمیق‌تر نمایید.

دیدگاه خود را اینجا بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

فیلدهای دلخواه برای نمایش را انتخاب کنید. سایر فیلدها مخفی می شود. برای ترتیب دلخواه فیلدها را به محل دلخواه بکشید و رها کنید.
  • عكس
  • شناسه محصول
  • امتیاز
  • قیمت
  • موجودی
  • موجودی
  • افزودن به سبد خرید
  • توضیحات
  • محتوا
  • وزن
  • ابعاد
  • اطلاعات تکمیلی
برای مخفی شدن نوار مقایسه، بیرون از کادر کلیک کنید
مقایسه