دستاویزاتیونٹ 2: ڈیٹا
Nexy کے ساتھ ایک نوٹس ایپ بنائیں، حصہ 5: نوٹوں کو SQLite میں اسٹور کریں۔
حصہ 5 نوٹوں کو Python لغت سے ایک SQLite ڈیٹا بیس میں منتقل کرتا ہے، جس میں ایک ماڈل، ایک منتقلی اور شروع کرنے کے لیے دو نوٹس ہوتے ہیں، اور صفحات انہیں وہاں سے پڑھتے ہیں۔
اس سے پہلے کہ آپ شروع کریں: پارٹ 4 کی ایپ۔
ORM اور مائیگریشن ٹول انسٹال کریں۔
uv add sqlmodel alembic
SQLModel ایک ٹیبل کو Python کلاس کے طور پر بیان کرتا ہے، اور Alembic ان کلاسوں میں ہونے والی تبدیلیوں کو منتقلی میں بدل دیتا ہے۔ Nexy بھی نہیں لپیٹتا ہے: آپ انہیں جیسے ہیں استعمال کرتے ہیں۔
ڈیٹا بیس کھولیں۔
ڈیٹا بیس کا پتہ پروجیکٹ کی جڑ میں .env میں جاتا ہے۔ nx migrate اور ایپ دونوں نے اسے وہاں سے پڑھا:
DATABASE_URL=sqlite:///dev.dbsqlite:///dev.db ایک فائل ہے، dev.db، nexyconfig.py کے آگے: SQLite کو سرور کی ضرورت نہیں ہے۔ .env کو گٹ سے دور رکھیں: یہ ایک حقیقی ڈیٹا بیس کے راز رکھتا ہے۔
انجن ڈیٹا بیس سے کنکشن ہے۔ یہ پڑھتا ہے DATABASE_URL، اسی فائل کے ساتھ بطور ڈیفالٹ جب متغیر سیٹ نہ ہو:
import os from dotenv import load_dotenvfrom sqlmodel import create_engine load_dotenv() engine = create_engine(os.getenv("DATABASE_URL", "sqlite:///dev.db"))ایک نوٹ بیان کریں۔
from sqlmodel import Field, SQLModel class Note(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) text: strماڈل اس خصوصیت کے ساتھ رہتا ہے جس سے اس کا تعلق ہے، اس کے کنٹرولر کے ساتھ:
from sqlmodel import Field, SQLModel class Note(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) text: strtable=True کلاس کو ایک میز بناتا ہے، note۔ جب کوئی نوٹ محفوظ کیا جاتا ہے تو ڈیٹا بیس کے ذریعہ id دیا جاتا ہے۔
ہجرت کے ساتھ ٹیبل بنائیں
nx migrate --initnx migrate -m "create notes"nx migrate --upgrade
--init alembic/ فولڈر لکھتا ہے اور اسے آپ کے ماڈل کی طرف اشارہ کرتا ہے۔ -m ماڈل کا ڈیٹا بیس سے موازنہ کرتا ہے اور ہجرت لکھتا ہے جو ٹیبل بناتا ہے۔ --upgrade اسے چلاتا ہے۔ ماڈل کو بعد میں تبدیل کریں، آخری دو کمانڈز کو دوبارہ چلائیں، اور ٹیبل مندرجہ ذیل ہے۔
ڈیٹا بیس سے نوٹس پڑھیں
src/notes.py کے افعال اپنے نام رکھتے ہیں، اس لیے صفحات بہت کم بدلتے ہیں: اب وہ سیشن کھولتے ہیں، ٹیبل سے استفسار کرتے ہیں، اور تاروں کی بجائے Note اشیاء واپس کرتے ہیں۔
from sqlmodel import Session, select from src.configs.db import enginefrom src.models.note_model import Note def all_notes() -> list[Note]: with Session(engine) as session: return list(session.exec(select(Note).order_by(Note.id))) def find(note_id: int) -> Note | None: with Session(engine) as session: return session.get(Note, note_id)from sqlmodel import Session, select from src.apps.notes.note_model import Notefrom src.configs.db import engine def all_notes() -> list[Note]: with Session(engine) as session: return list(session.exec(select(Note).order_by(Note.id))) def find(note_id: int) -> Note | None: with Session(engine) as session: return session.get(Note, note_id)شروع کرنے کے لیے دو نوٹ شامل کریں۔
ایک بیج اسکرپٹ ایک خالی ڈیٹا بیس کو بھرتا ہے، لہذا پروجیکٹ کی ہر نئی کاپی کچھ دکھانے کے ساتھ شروع ہوتی ہے:
from sqlmodel import Session, select from src.configs.db import enginefrom src.models.note_model import Note def seed() -> None: with Session(engine) as session: if session.exec(select(Note)).first() is None: session.add_all([Note(text="Buy milk"), Note(text="Ship Nexy")]) session.commit() if __name__ == "__main__": seed()from sqlmodel import Session, select from src.apps.notes.note_model import Notefrom src.configs.db import engine def seed() -> None: with Session(engine) as session: if session.exec(select(Note)).first() is None: session.add_all([Note(text="Buy milk"), Note(text="Ship Nexy")]) session.commit() if __name__ == "__main__": seed()python -m src.seed
آغاز پر، Nexy حصہ 6 کے ایکشنز کو تلاش کرنے کے لیے src/ کے ہر ماڈیول کو درآمد کرتا ہے۔ if __name__ == "__main__": مندرجہ بالا کمانڈ کے لیے بیج رکھتا ہے: ایپ کے ذریعے درآمد کردہ، فائل صرف seed کی وضاحت کرتی ہے، اور کچھ بھی نہیں چھوتی۔
ڈیٹا بیس سے نوٹس دکھائیں۔
from "@/components/NoteCard.nexy" import NoteCardfrom src.notes import all_notes notes = all_notes()<section class="app-page"> <h1>Notes</h1> {% for note in notes %} <NoteCard id="{{ note.id }}" text="{{ note.text }}" /> {% endfor %}</section>from nexy import notFoundfrom src.notes import find id: prop[int]note = find(id)if note is None: notFound()<section class="app-page"> <h1>{{ note.text }}</h1> <a href="/notes">All notes</a></section>from src.notes import all_notes async def GET(): return [note.model_dump() for note in all_notes()]from "@/components/NoteCard.nexy" import NoteCardfrom src.notes import all_notes notes = all_notes()<section class="app-page"> <h1>Notes</h1> {% for note in notes %} <NoteCard id="{{ note.id }}" text="{{ note.text }}" /> {% endfor %}</section>from nexy import notFoundfrom nexy.decorators import Controllerfrom nexy.hooks import useViewsfrom src.notes import all_notes, find LAYOUT = "src/apps/layout.nexy" def page(view: str, **context: object): return useViews(LAYOUT, context={"children": useViews(view, context=context)}) @Controller("/notes")class NotesController: async def get(self): return page("src/apps/notes/notes_view.nexy") @Controller("/notes/{id}")class NoteController: async def get(self, id: int): note = find(id) if note is None: notFound() return page("src/apps/notes/note_view.nexy", text=note.text) @Controller("/api/notes")class NotesApiController: async def get(self) -> list[dict]: return [note.model_dump() for note in all_notes()]کھولیں http://localhost:3000/notes: وہی دو کارڈ، اب dev.db سے پڑھیں۔ دوبارہ شروع کریں nexy dev، اور وہ ابھی تک موجود ہیں۔
جو آپ نے سیکھا۔
- SQLModel ایک میز کو کلاس کے طور پر بیان کرتا ہے۔
src/configs/db.pyمیں انجن ڈیٹا بیس کو کھولتا ہے۔ nx migrateلکھتے ہیں اور ہجرت چلاتے ہیں:--initایک بار، پھر-mاور--upgradeفی تبدیلی۔- صفحات اور کنٹرولرز سادہ Python فنکشنز کو کال کرتے ہیں جو ڈیٹا بیس سے استفسار کرتے ہیں: Nexy کوئی پرت نہیں ڈالتا۔
اگلے اقدامات
- حصہ 6: فارم سے ایک نوٹ بنائیں
- SQLite: pragmas، async رسائی اور ان میموری ڈیٹا بیس پر ٹیسٹ