Skip to content

Database Library — اردو/ڈیٹا_بیس

This library provides Urdu-keyword database clients for MySQL, PostgreSQL, MongoDB, Cassandra, Firebase/Firestore, and SQLite. All classes share a common base interface.

اردو: یہ لائبریری MySQL، PostgreSQL، MongoDB، Cassandra، Firebase/Firestore اور SQLite کے لیے اردو کلید الفاظ والے ڈیٹا بیس کلائنٹ فراہم کرتی ہے۔ تمام کلاسز ایک مشترکہ بنیادی انٹرفیس استعمال کرتی ہیں۔

Import:

درآمد { مائی_ایس_کیو_ایل, پوسٹ_گریس, مونگو_ڈی_بی, کسینڈرا, فائر_بیس } سے "اردو/ڈیٹا_بیس";

Install dependencies (as needed):

pip install mysql-connector-python     # مائی_ایس_کیو_ایل
pip install psycopg2-binary            # پوسٹ_گریس
pip install pymongo                    # مونگو_ڈی_بی
pip install cassandra-driver           # کسینڈرا
pip install firebase-admin             # فائر_بیس (admin mode)

Table of Contents

  1. Common Interface
  2. MySQL (مائی_ایس_کیو_ایل)
  3. PostgreSQL (پوسٹ_گریس)
  4. MongoDB (مونگو_ڈی_بی)
  5. Cassandra (کسینڈرا)
  6. Firebase / Firestore (فائر_بیس)
  7. Transactions and Savepoints
  8. SQLite (ایس_کیو_لائٹ)
  9. Factory Function

Common Interface — مشترکہ انٹرفیس

All database classes (مائی_ایس_کیو_ایل, پوسٹ_گریس, ایس_کیو_لائٹ, مونگو_ڈی_بی, کسینڈرا) share the following methods:

اردو: تمام ڈیٹا بیس کلاسز یہ مشترکہ طریقے رکھتی ہیں: جوڑیں() سے جڑنا، منقطع() سے قطع تعلق، سوال() سے SELECT چلانا، چلائیں() سے INSERT/UPDATE/DELETE اور لین_دین() سے محفوظ لین دین۔ سوال کے نتائج row["کالم"] یا row.کالم دونوں طریقوں سے دیکھے جا سکتے ہیں۔

طریقہ واپسی تفصیل
await db.جوڑیں() self Open the connection
await db.منقطع() Close the connection
await db.سوال(query, params) list[dict] Execute SELECT; returns list of rows as dicts
await db.چلائیں(query, params) int Execute INSERT/UPDATE/DELETE; returns rowcount
await db.داخل(table, data_dict) int Insert helper: builds INSERT from a dict
await db.لین_دین_شروع() BEGIN a transaction
await db.کمٹ() COMMIT
await db.واپسی() ROLLBACK
await db.نقطہ_محفوظ(نام) SAVEPOINT name
await db.نقطہ_واپسی(نام) ROLLBACK TO SAVEPOINT name
await db.نقطہ_چھوڑیں(نام) RELEASE SAVEPOINT name
await db.لین_دین(callback) Run async callback in a transaction; auto-commit or auto-rollback

Row access: All query results return rows as _UrduObj instances, which support both dict-style (row["کالم"]) and dot-style (row.کالم) access.

Placeholders: Use ? in queries (automatically converted to %s for MySQL/PostgreSQL).


MySQL (مائی_ایس_کیو_ایل) — مائی SQL ڈیٹا بیس

Wraps mysql-connector-python with UTF-8 support and InnoDB transactions.

اردو: یہ mysql-connector-python کا ریپر ہے جس میں UTF-8 سپورٹ اور InnoDB لین دین شامل ہیں۔ ترتیب میں میزبان، صارف، پاس ورڈ، پورٹ اور ڈیٹا بیس کا نام دیا جاتا ہے۔

Config keys:

کلید پہلے سے تفصیل
میزبان "localhost" MySQL host
صارف "root" Username
پاس_ورڈ "" Password
پورٹ 3306 Port
ڈیٹا_بیس (none) Database name

MySQL Example: Full CRUD with Transactions — مکمل CRUD مثال

اردو: یہ مثال MySQL میں مکمل CRUD عمل دکھاتی ہے: جدول بنانا، ڈیٹا داخل کرنا (INSERT)، ڈیٹا پڑھنا (SELECT)، ڈیٹا تازہ کرنا (UPDATE)، ڈیٹا حذف کرنا (DELETE) اور محفوظ لین دین۔

درآمد { مائی_ایس_کیو_ایل } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن مرکز() {
    متغیر db = نیا مائی_ایس_کیو_ایل({
        "میزبان":   "localhost",
        "صارف":     "root",
        "پاس_ورڈ": "پاس_ورڈ",
        "پورٹ":    3306
    });

    // ─── جڑنا ─────────────────────────────────────────
    انتظار db.جوڑیں();
    لکھو("MySQL سے جڑ گئے");

    // ─── ڈیٹا بیس اور جدول ──────────────────────────
    انتظار db.چلائیں("CREATE DATABASE IF NOT EXISTS urdu_test CHARACTER SET utf8mb4");
    انتظار db.چلائیں("USE urdu_test");
    انتظار db.چلائیں("DROP TABLE IF EXISTS طلباء");
    انتظار db.چلائیں(`
        CREATE TABLE طلباء (
            شناخت  INT AUTO_INCREMENT PRIMARY KEY,
            نام    VARCHAR(100) NOT NULL,
            عمر    INT,
            شہر    VARCHAR(50)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    `);
    لکھو("جدول بنایا گیا");

    // ─── INSERT ───────────────────────────────────────
    انتظار db.چلائیں(
        "INSERT INTO طلباء (نام, عمر, شہر) VALUES (?, ?, ?)",
        ["احمد", 20, "کراچی"]
    );
    انتظار db.چلائیں(
        "INSERT INTO طلباء (نام, عمر, شہر) VALUES (?, ?, ?)",
        ["فاطمہ", 22, "لاہور"]
    );
    // داخل() مددگار
    انتظار db.داخل("طلباء", { "نام": "علی", "عمر": 19, "شہر": "اسلام آباد" });
    لکھو("3 طلباء داخل کیے");

    // ─── SELECT ───────────────────────────────────────
    متغیر سب = انتظار db.سوال("SELECT * FROM طلباء ORDER BY شناخت");
    لکھو(`\nکل طلباء: ${لمبائی(سب)}`);
    کے_لیے (متغیر ط کا سب) {
        لکھو(`  ${ط["نام"]} — ${ط["شہر"]} (${ط["عمر"]})`);
    }

    // ─── WHERE فلٹر ───────────────────────────────────
    متغیر کراچی = انتظار db.سوال(
        "SELECT نام, عمر FROM طلباء WHERE شہر = ?", ["کراچی"]
    );
    لکھو(`\nکراچی کے طلباء: ${لمبائی(کراچی)}`);

    // ─── UPDATE ───────────────────────────────────────
    انتظار db.چلائیں(
        "UPDATE طلباء SET عمر = ? WHERE نام = ?", [21, "احمد"]
    );
    متغیر تازہ = انتظار db.سوال(
        "SELECT عمر FROM طلباء WHERE نام = ?", ["احمد"]
    );
    لکھو(`\nahmad کی نئی عمر: ${تازہ[0]["عمر"]}`);

    // ─── DELETE ───────────────────────────────────────
    انتظار db.چلائیں("DELETE FROM طلباء WHERE نام = ?", ["علی"]);
    متغیر بعد = انتظار db.سوال("SELECT COUNT(*) AS تعداد FROM طلباء");
    لکھو(`\nحذف کے بعد: ${بعد[0]["تعداد"]} طلباء`);

    // ─── Aggregate ────────────────────────────────────
    متغیر اعداد = انتظار db.سوال(
        "SELECT AVG(عمر) AS اوسط, MAX(عمر) AS زیادہ, MIN(عمر) AS کم FROM طلباء"
    );
    لکھو(`\nاوسط عمر: ${اعداد[0]["اوسط"]}`);

    // ─── Transaction ──────────────────────────────────
    انتظار db.لین_دین_شروع();
    کوشش {
        انتظار db.چلائیں(
            "INSERT INTO طلباء (نام, عمر, شہر) VALUES (?, ?, ?)",
            ["زینب", 24, "ملتان"]
        );
        انتظار db.کمٹ();
        لکھو("\nTransaction COMMIT کامیاب");
    } پکڑو (غ) {
        انتظار db.واپسی();
        لکھو(`Transaction ROLLBACK: ${غ}`);
    }

    // ─── لین_دین() wrapper ────────────────────────────
    انتظار db.لین_دین(غیر_متزامن فنکشن() {
        انتظار db.چلائیں(
            "INSERT INTO طلباء (نام, عمر, شہر) VALUES (?, ?, ?)",
            ["عمر", 26, "پشاور"]
        );
    });
    لکھو("لین_دین() COMMIT");

    // ─── صفائی ────────────────────────────────────────
    انتظار db.چلائیں("DROP TABLE IF EXISTS طلباء");
    انتظار db.چلائیں("DROP DATABASE IF EXISTS urdu_test");
    انتظار db.منقطع();
    لکھو("\nMySQL منقطع");
}

انتظار مرکز();

PostgreSQL (پوسٹ_گریس) — پوسٹ گریس ڈیٹا بیس

Wraps psycopg2 with RealDictCursor for named-column access.

اردو: یہ psycopg2 کا ریپر ہے جس میں RealDictCursor سے نامی کالم تک رسائی ملتی ہے۔ نتائج row.کالم (نقطہ طرز) سے پڑھے جا سکتے ہیں۔ اس میں آخری_شناخت() طریقہ بھی ہے جو آخری داخل کردہ قطار کی شناخت واپس کرتا ہے۔

Config keys:

کلید پہلے سے تفصیل
میزبان "localhost" PostgreSQL host
صارف "postgres" Username
پاس_ورڈ "" Password
پورٹ 5432 Port
ڈیٹا_بیس "postgres" Database name

Additional method: await db.آخری_شناخت(table, column) returns the last inserted serial ID via currval.


PostgreSQL Example: Full CRUD

درآمد { پوسٹ_گریس } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن مرکز() {
    متغیر db = نیا پوسٹ_گریس({
        "میزبان":    "localhost",
        "صارف":      "postgres",
        "پاس_ورڈ":  "پاس_ورڈ",
        "ڈیٹا_بیس": "postgres",
        "پورٹ":      5432
    });

    انتظار db.جوڑیں();
    لکھو("PostgreSQL سے جڑ گئے");

    // ─── جدول بنائیں ─────────────────────────────────
    انتظار db.چلائیں("DROP TABLE IF EXISTS ملازمین");
    انتظار db.چلائیں(`
        CREATE TABLE ملازمین (
            شناخت  SERIAL PRIMARY KEY,
            نام    VARCHAR(100) NOT NULL,
            تنخواہ NUMERIC(10,2),
            شعبہ   VARCHAR(50)
        )
    `);

    // ─── INSERT ───────────────────────────────────────
    انتظار db.داخل("ملازمین", {
        "نام": "احمد خان", "تنخواہ": 75000, "شعبہ": "انجینئرنگ"
    });
    انتظار db.داخل("ملازمین", {
        "نام": "فاطمہ رضا", "تنخواہ": 85000, "شعبہ": "مارکیٹنگ"
    });
    انتظار db.داخل("ملازمین", {
        "نام": "علی حسن", "تنخواہ": 65000, "شعبہ": "انجینئرنگ"
    });
    لکھو("3 ملازم داخل کیے");

    // ─── SELECT ───────────────────────────────────────
    متغیر سب = انتظار db.سوال("SELECT * FROM ملازمین ORDER BY شناخت");
    لکھو(`\nکل ملازمین: ${لمبائی(سب)}`);
    کے_لیے (متغیر م کا سب) {
        لکھو(`  ${م.نام} | ${م.شعبہ} | Rs ${م.تنخواہ}`);
    }

    // ─── فلٹر + ترتیب ─────────────────────────────────
    متغیر انجینئر = انتظار db.سوال(
        "SELECT * FROM ملازمین WHERE شعبہ = ? ORDER BY تنخواہ DESC",
        ["انجینئرنگ"]
    );
    لکھو(`\nانجینئرنگ شعبہ: ${لمبائی(انجینئر)} ملازم`);

    // ─── Aggregate ────────────────────────────────────
    متغیر اعداد = انتظار db.سوال(
        "SELECT AVG(تنخواہ) AS اوسط, MAX(تنخواہ) AS زیادہ FROM ملازمین"
    );
    لکھو(`\nاوسط تنخواہ: ${اعداد[0]["اوسط"]}`);
    لکھو(`زیادہ تنخواہ: ${اعداد[0]["زیادہ"]}`);

    // ─── UPDATE ───────────────────────────────────────
    انتظار db.چلائیں(
        "UPDATE ملازمین SET تنخواہ = تنخواہ * 1.10 WHERE شعبہ = ?",
        ["انجینئرنگ"]
    );
    لکھو("\nانجینئرنگ کو 10% اضافہ ملا");

    // ─── DELETE ───────────────────────────────────────
    متغیر حذف_شدہ = انتظار db.چلائیں(
        "DELETE FROM ملازمین WHERE تنخواہ < ?", [70000]
    );
    لکھو(`\n${حذف_شدہ} ملازم حذف کیے (کم تنخواہ)`);

    // ─── Transaction ──────────────────────────────────
    انتظار db.لین_دین(غیر_متزامن فنکشن() {
        انتظار db.چلائیں(
            "INSERT INTO ملازمین (نام, تنخواہ, شعبہ) VALUES (?, ?, ?)",
            ["نیا_ملازم", 90000, "IT"]
        );
        انتظار db.چلائیں(
            "UPDATE ملازمین SET تنخواہ = تنخواہ + 5000 WHERE شعبہ = ?",
            ["IT"]
        );
    });
    لکھو("Transaction COMMIT");

    // ─── صفائی ────────────────────────────────────────
    انتظار db.چلائیں("DROP TABLE IF EXISTS ملازمین");
    انتظار db.منقطع();
    لکھو("\nPostgreSQL منقطع");
}

انتظار مرکز();

MongoDB (مونگو_ڈی_بی) — مونگو ڈی بی

Wraps pymongo with collection-based access.

اردو: یہ pymongo کا ریپر ہے جس میں مجموعہ (collection) پر مبنی رسائی ملتی ہے۔ MongoDB ایک NoSQL ڈیٹا بیس ہے جو JSON جیسی دستاویزات (documents) محفوظ کرتا ہے۔ جدول کی بجائے مجموعہ اور قطار کی بجائے دستاویز استعمال ہوتی ہے۔

Config keys:

کلید پہلے سے تفصیل
میزبان "localhost" MongoDB host
پورٹ 27017 Port
ڈیٹا_بیس "test" Database name
uri (none) Full connection string (overrides host/port)

After connecting, get a collection handle with db.مجموعہ("نام").

اردو: جڑنے کے بعد db.مجموعہ("نام") سے مجموعہ کا ہینڈل حاصل کریں۔ مجموعہ طریقے تلاش، ایک تلاش، داخل، بہت داخل، تازہ کاری، حذف اور گنتی کی سہولت دیتے ہیں۔

Collection methods:

طریقہ واپسی تفصیل
await col.تلاش(filter, opts, حد=n) list[dict] Find documents
await col.ایک_تلاش(filter) dict or None Find one document
await col.داخل(document) str Insert one; returns inserted _id
await col.بہت_داخل(documents) list[str] Insert many; returns list of _ids
await col.تازہ_کاری(filter, update) int Update many with $set; returns modified count
await col.حذف(filter) int Delete many; returns deleted count
await col.گنتی(filter) int Count matching documents

MongoDB Example: Full CRUD

درآمد { مونگو_ڈی_بی } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن مرکز() {
    متغیر mongo = نیا مونگو_ڈی_بی({
        "میزبان":    "localhost",
        "پورٹ":      27017,
        "ڈیٹا_بیس": "urdu_test"
    });

    انتظار mongo.جوڑیں();
    لکھو("MongoDB سے جڑ گئے");

    متغیر کتابیں = mongo.مجموعہ("کتابیں");

    // ─── پرانا ڈیٹا صاف کریں ──────────────────────────
    انتظار کتابیں.حذف({});

    // ─── ایک دستاویز داخل ────────────────────────────
    متغیر نئی_id = انتظار کتابیں.داخل({
        "عنوان": "آگ کا دریا",
        "مصنف":  "قرة العین حیدر",
        "صنف":   "ناول",
        "سال":   1959,
        "قیمت":  1200
    });
    لکھو(`نئی کتاب ID: ${نئی_id}`);

    // ─── بہت دستاویز داخل ────────────────────────────
    متغیر ids = انتظار کتابیں.بہت_داخل([
        { "عنوان": "گلستان سعدی", "مصنف": "سعدی شیرازی", "صنف": "شاعری", "سال": 1258, "قیمت": 850  },
        { "عنوان": "اداس نسلیں",  "مصنف": "عبداللہ حسین", "صنف": "ناول",  "سال": 1963, "قیمت": 980  },
        { "عنوان": "فیض کا کلام", "مصنف": "فیض احمد فیض", "صنف": "شاعری", "سال": 1941, "قیمت": 650  }
    ]);
    لکھو(`${لمبائی(ids)} کتابیں داخل`);

    // ─── تمام تلاش ────────────────────────────────────
    متغیر سب = انتظار کتابیں.تلاش({});
    لکھو(`\nکل کتابیں: ${لمبائی(سب)}`);
    کے_لیے (متغیر ک کا سب) {
        لکھو(`  ${ک["عنوان"]} — ${ک["مصنف"]}`);
    }

    // ─── فلٹر ─────────────────────────────────────────
    متغیر شاعری = انتظار کتابیں.تلاش({ "صنف": "شاعری" });
    لکھو(`\nشاعری کتابیں: ${لمبائی(شاعری)}`);

    // ─── ایک تلاش ─────────────────────────────────────
    متغیر ایک = انتظار کتابیں.ایک_تلاش({ "عنوان": "آگ کا دریا" });
    اگر (ایک) {
        لکھو(`\nملی: ${ایک["عنوان"]} (${ایک["سال"]})`);
    }

    // ─── MongoDB Query Operators ───────────────────────
    // قیمت 900 سے زیادہ
    متغیر مہنگی = انتظار کتابیں.تلاش({ "قیمت": { "$gt": 900 } });
    لکھو(`\n900 سے مہنگی: ${لمبائی(مہنگی)}`);

    // حد کے ساتھ
    متغیر پہلی_2 = انتظار کتابیں.تلاش({}, {}, حد=2);
    لکھو(`\nپہلی 2 کتابیں:`);
    کے_لیے (متغیر ک کا پہلی_2) {
        لکھو(`  ${ک["عنوان"]}`);
    }

    // ─── تازہ کاری ────────────────────────────────────
    متغیر تازہ = انتظار کتابیں.تازہ_کاری(
        { "صنف": "شاعری" },
        { "دستیاب": سچ }
    );
    لکھو(`\n${تازہ} شاعری کتابیں تازہ کی گئیں`);

    // ─── گنتی ─────────────────────────────────────────
    متغیر کل     = انتظار کتابیں.گنتی({});
    متغیر ناول   = انتظار کتابیں.گنتی({ "صنف": "ناول" });
    لکھو(`\nکل: ${کل} | ناول: ${ناول}`);

    // ─── حذف ──────────────────────────────────────────
    متغیر حذف = انتظار کتابیں.حذف({ "قیمت": { "$lt": 700 } });
    لکھو(`\n${حذف} سستی کتابیں حذف`);

    // ─── منقطع ────────────────────────────────────────
    انتظار mongo.منقطع();
    لکھو("MongoDB منقطع");
}

انتظار مرکز();

MongoDB: Connection String

درآمد { مونگو_ڈی_بی } سے "اردو/ڈیٹا_بیس";

// Atlas یا تصدیق والا کنکشن
متغیر mongo = نیا مونگو_ڈی_بی({
    "uri":       "mongodb+srv://صارف:پاس@cluster0.abc.mongodb.net",
    "ڈیٹا_بیس": "میری_ایپ"
});

غیر_متزامن فنکشن مرکز() {
    انتظار mongo.جوڑیں();
    متغیر صارفین = mongo.مجموعہ("صارفین");
    متغیر گنتی = انتظار صارفین.گنتی({});
    لکھو(`صارفین: ${گنتی}`);
    انتظار mongo.منقطع();
}

انتظار مرکز();

Cassandra (کسینڈرا) — کسینڈرا ڈیٹا بیس

Wraps cassandra-driver for Apache Cassandra and DataStax Astra.

اردو: یہ Apache Cassandra اور DataStax Astra کے لیے cassandra-driver کا ریپر ہے۔ Cassandra ایک تقسیم شدہ NoSQL ڈیٹا بیس ہے جو بڑے پیمانے پر ڈیٹا کے لیے موزوں ہے اور کثیر نوڈ کلسٹروں میں چلتا ہے۔

Important: Cassandra CQL requires ASCII identifiers for table and column names. Use ASCII names in CREATE TABLE and queries. Urdu names can be used as variable names in your code.

Config keys:

کلید پہلے سے تفصیل
میزبان ["localhost"] List of host addresses (or single string)
پورٹ 9042 Port
صارف (none) Username (optional)
پاس_ورڈ (none) Password (optional)
کی_اسپیس "" Initial keyspace (optional)

DDL Methods:

طریقہ تفصیل
await db.کی_اسپیس_بنائیں(نام, حکمت, نقلیں) Create keyspace if not exists
await db.کی_اسپیس_چنو(نام) Switch to keyspace
await db.جدول_بنائیں(نام, {col: type}) CREATE TABLE IF NOT EXISTS
await db.جدول_مٹائیں(نام) DROP TABLE IF EXISTS
await db.کی_اسپیس_مٹائیں(نام) DROP KEYSPACE IF EXISTS

Prepared Statements:

طریقہ تفصیل
db.تیار(query) Prepare a CQL statement (synchronous)
await db.تیار_چلائیں(stmt, params) Execute prepared statement
await db.تیار_سوال(stmt, params) Execute prepared SELECT, returns rows
await db.بیچ(list) Execute a LOGGED BATCH of (query, params) pairs

Cassandra Example: Full CRUD

درآمد { کسینڈرا } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن مرکز() {
    متغیر db = نیا کسینڈرا({
        "میزبان": ["localhost"],
        "پورٹ":   9042
    });

    // ─── جڑنا ────────────────────────────────────────
    انتظار db.جوڑیں();
    لکھو("Cassandra سے جڑ گئے");

    // ─── کی_اسپیس بنائیں ─────────────────────────────
    انتظار db.کی_اسپیس_بنائیں("urdu_ks", "SimpleStrategy", 1);
    انتظار db.کی_اسپیس_چنو("urdu_ks");
    لکھو("کی_اسپیس تیار");

    // ─── جدول بنائیں (ASCII نام ضروری) ──────────────
    انتظار db.چلائیں("DROP TABLE IF EXISTS students");
    انتظار db.جدول_بنائیں("students", {
        "id":     "UUID PRIMARY KEY",
        "naam":   "TEXT",
        "umar":   "INT",
        "shehar": "TEXT",
        "number": "FLOAT"
    });
    لکھو("جدول students بنا");

    // ─── INSERT ───────────────────────────────────────
    انتظار db.چلائیں(
        "INSERT INTO students (id, naam, umar, shehar, number) VALUES (uuid(), 'Ahmad', 20, 'Karachi', 88.5)"
    );
    انتظار db.چلائیں(
        "INSERT INTO students (id, naam, umar, shehar, number) VALUES (uuid(), 'Fatima', 22, 'Lahore', 91.0)"
    );
    لکھو("طلباء داخل کیے");

    // ─── SELECT ───────────────────────────────────────
    متغیر سب = انتظار db.سوال("SELECT naam, umar, shehar, number FROM students");
    لکھو(`\nکل طلباء: ${لمبائی(سب)}`);
    کے_لیے (متغیر ط کا سب) {
        لکھو(`  ${ط["naam"]} — ${ط["shehar"]} — ${ط["number"]}`);
    }

    // ─── COUNT ────────────────────────────────────────
    متغیر گنتی = انتظار db.سوال("SELECT COUNT(*) FROM students");
    لکھو(`\nتعداد: ${گنتی[0]["count"]}`);

    // ─── تیار بیان ────────────────────────────────────
    متغیر داخل_تیار = db.تیار(
        "INSERT INTO students (id, naam, umar, shehar, number) VALUES (uuid(), ?, ?, ?, ?)"
    );
    انتظار db.تیار_چلائیں(داخل_تیار, ["Zainab", 21, "Multan", 83.0]);
    انتظار db.تیار_چلائیں(داخل_تیار, ["Umar", 23, "Peshawar", 79.5]);
    لکھو("\nتیار بیان سے 2 مزید داخل");

    // ─── SELECT تیار بیان ─────────────────────────────
    متغیر منتخب_تیار = db.تیار("SELECT naam, number FROM students WHERE naam = ? ALLOW FILTERING");
    متغیر نتیجہ = انتظار db.تیار_سوال(منتخب_تیار, ["Ahmad"]);
    اگر (لمبائی(نتیجہ) > 0) {
        لکھو(`\nاحمد کا نمبر: ${نتیجہ[0]["number"]}`);
    }

    // ─── BATCH ────────────────────────────────────────
    انتظار db.چلائیں("DROP TABLE IF EXISTS masnoaat");
    انتظار db.جدول_بنائیں("masnoaat", {
        "id":     "UUID PRIMARY KEY",
        "naam":   "TEXT",
        "qeemat": "DECIMAL"
    });
    متغیر م_تیار = db.تیار(
        "INSERT INTO masnoaat (id, naam, qeemat) VALUES (uuid(), ?, ?)"
    );
    انتظار db.بیچ([
        [م_تیار, ["Kitab", 250]],
        [م_تیار, ["Qalam", 50]],
        [م_تیار, ["Bag",   800]]
    ]);
    متغیر مصنوعات = انتظار db.سوال("SELECT COUNT(*) FROM masnoaat");
    لکھو(`\nBATCH: ${مصنوعات[0]["count"]} مصنوعات`);

    // ─── TTL ──────────────────────────────────────────
    انتظار db.چلائیں("DROP TABLE IF EXISTS aarzi");
    انتظار db.جدول_بنائیں("aarzi", {
        "id":      "UUID PRIMARY KEY",
        "paigham": "TEXT"
    });
    // 1 گھنٹے بعد خودبخود ختم
    انتظار db.چلائیں(
        "INSERT INTO aarzi (id, paigham) VALUES (uuid(), 'عارضی پیغام') USING TTL 3600"
    );
    لکھو("\nTTL اندراج کامیاب");

    // ─── UPDATE ───────────────────────────────────────
    // Cassandra میں UPDATE کے لیے PRIMARY KEY ضروری ہے
    متغیر قطاریں = انتظار db.سوال("SELECT id, naam FROM students");
    کے_لیے (متغیر ق کا قطاریں) {
        اگر (ق["naam"] == "Ahmad") {
            انتظار db.چلائیں(`UPDATE students SET number = 95.0 WHERE id = ${ق["id"]}`);
            لکھو(`\nahmad کا نمبر 95.0 کیا گیا`);
        }
    }

    // ─── صفائی ────────────────────────────────────────
    انتظار db.جدول_مٹائیں("students");
    انتظار db.جدول_مٹائیں("masnoaat");
    انتظار db.جدول_مٹائیں("aarzi");
    انتظار db.کی_اسپیس_مٹائیں("urdu_ks");

    انتظار db.منقطع();
    لکھو("\nCassandra منقطع");
}

انتظار مرکز();

Cassandra: Authentication and Multiple Nodes

درآمد { کسینڈرا } سے "اردو/ڈیٹا_بیس";

// کثیر نوڈ کلسٹر + تصدیق
متغیر db = نیا کسینڈرا({
    "میزبان":    ["node1.example.com", "node2.example.com", "node3.example.com"],
    "پورٹ":      9042,
    "صارف":      "cassandra",
    "پاس_ورڈ":  "cassandra",
    "کی_اسپیس": "production_ks"
});

غیر_متزامن فنکشن مرکز() {
    انتظار db.جوڑیں();
    لکھو("کلسٹر سے جڑ گئے");
    متغیر نتیجہ = انتظار db.سوال("SELECT cluster_name FROM system.local");
    لکھو(`کلسٹر: ${نتیجہ[0]["cluster_name"]}`);
    انتظار db.منقطع();
}

انتظار مرکز();

Firebase / Firestore (فائر_بیس) — فائر بیس

Supports two modes: admin (server-side with service account) and web (client-side with API key).

اردو: Firebase دو طریقوں میں کام کرتا ہے: admin (سرور کی طرف، سروس اکاؤنٹ JSON فائل سے) اور web (کلائنٹ کی طرف، API کلید سے)۔ یہ Firestore دستاویز ڈیٹا بیس اور Realtime Database دونوں کی سہولت دیتا ہے۔

Admin Mode

درآمد { فائر_بیس } سے "اردو/ڈیٹا_بیس";

// service account JSON فائل سے
متغیر fb = نیا فائر_بیس({
    "اسناد":    "serviceAccountKey.json",
    "منصوبہ":   "میرا-پروجیکٹ",
    "databaseURL": "https://میرا-پروجیکٹ-default-rtdb.firebaseio.com"
});

غیر_متزامن فنکشن مرکز() {
    انتظار fb.جوڑیں();

    // Firestore
    متغیر صارفین = fb.مجموعہ("صارفین");
    متغیر id = انتظار صارفین.اضافہ({ "نام": "احمد", "ای_میل": "ahmed@test.com" });
    لکھو(`دستاویز ID: ${id}`);

    متغیر دستاویز = انتظار صارفین.حاصل(id);
    لکھو(`نام: ${دستاویز["نام"]}`);

    // Realtime Database
    انتظار fb.ریئل_لکھو("/حالت", { "آن_لائن": سچ });
    متغیر حالت = انتظار fb.ریئل_پڑھو("/حالت");
    لکھو(`آن_لائن: ${حالت["آن_لائن"]}`);

    انتظار fb.منقطع();
}

انتظار مرکز();

Web Mode (API Key)

درآمد { فائر_بیس } سے "اردو/ڈیٹا_بیس";

متغیر fb = نیا فائر_بیس({
    "apiKey":    "AIzaSy...",
    "projectId": "میرا-پروجیکٹ"
});

غیر_متزامن فنکشن مرکز() {
    // ای میل سے سائن ان
    انتظار fb.ای_میل_داخل("صارف@مثال.com", "پاس_ورڈ");

    // Firestore
    متغیر نوٹس = fb.مجموعہ("نوٹس");
    متغیر id = انتظار نوٹس.اضافہ({ "عنوان": "پہلا نوٹ", "مواد": "..." });

    متغیر تمام = انتظار نوٹس.سبھی();
    کے_لیے (متغیر ن کا تمام) {
        لکھو(`${ن["id"]}: ${ن["عنوان"]}`);
    }

    انتظار نوٹس.حذف(id);
    انتظار fb.منقطع();
}

انتظار مرکز();

Firestore Collection Methods:

طریقہ تفصیل
await col.اضافہ(data) Add document with auto-ID; returns ID string
await col.مقرر(id, data) Set/overwrite document by ID
await col.حاصل(id) Get document by ID; returns dict or None
await col.سبھی() Get all documents in collection
await col.حذف(id) Delete document by ID

Transactions and Savepoints — لین دین اور محفوظ نقطے

Basic Transaction Pattern — بنیادی لین دین نمونہ

اردو: لین دین (transaction) ایک یا زیادہ ڈیٹا بیس عمل کو اکٹھے محفوظ (COMMIT) یا رد (ROLLBACK) کرنے کا طریقہ ہے۔ اگر کوئی ایک عمل ناکام ہو تو پورا لین دین واپس ہو جاتا ہے — اس سے ڈیٹا ہمیشہ درست رہتا ہے۔

درآمد { مائی_ایس_کیو_ایل } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن منتقلی_کرو(db, از_کھاتہ, بہ_کھاتہ, رقم) {
    // طریقہ 1: دستی BEGIN/COMMIT/ROLLBACK
    انتظار db.لین_دین_شروع();
    کوشش {
        انتظار db.چلائیں(
            "UPDATE کھاتے SET بقیہ = بقیہ - ? WHERE نام = ?",
            [رقم, از_کھاتہ]
        );
        انتظار db.چلائیں(
            "UPDATE کھاتے SET بقیہ = بقیہ + ? WHERE نام = ?",
            [رقم, بہ_کھاتہ]
        );
        انتظار db.کمٹ();
        لکھو("منتقلی کامیاب");
    } پکڑو (غ) {
        انتظار db.واپسی();
        لکھو(`منتقلی ناکام: ${غ}`);
        پھینکو غ;
    }
}

غیر_متزامن فنکشن مرکز() {
    متغیر db = نیا مائی_ایس_کیو_ایل({
        "میزبان": "localhost", "صارف": "root", "پاس_ورڈ": ""
    });
    انتظار db.جوڑیں();
    انتظار db.چلائیں("CREATE DATABASE IF NOT EXISTS بینک");
    انتظار db.چلائیں("USE بینک");
    انتظار db.چلائیں(`CREATE TABLE IF NOT EXISTS کھاتے (
        نام VARCHAR(50) PRIMARY KEY, بقیہ DECIMAL(10,2)
    )`);
    انتظار db.چلائیں("INSERT IGNORE INTO کھاتے VALUES ('احمد', 10000), ('فاطمہ', 5000)");

    // طریقہ 1: دستی
    انتظار منتقلی_کرو(db, "احمد", "فاطمہ", 2000);

    // طریقہ 2: لین_دین() wrapper (خودکار)
    انتظار db.لین_دین(غیر_متزامن فنکشن() {
        انتظار db.چلائیں(
            "UPDATE کھاتے SET بقیہ = بقیہ + ? WHERE نام = ?", [500, "احمد"]
        );
        انتظار db.چلائیں(
            "UPDATE کھاتے SET بقیہ = بقیہ - ? WHERE نام = ?", [500, "فاطمہ"]
        );
    });
    لکھو("لین_دین() COMMIT کامیاب");

    // طریقہ 3: غلطی پر خودکار ROLLBACK
    کوشش {
        انتظار db.لین_دین(غیر_متزامن فنکشن() {
            انتظار db.چلائیں(
                "UPDATE کھاتے SET بقیہ = بقیہ - ? WHERE نام = ?", [999999, "احمد"]
            );
            پھینکو نیا غلطی("بقیہ ناکافی!");
        });
    } پکڑو (غ) {
        لکھو(`خودکار ROLLBACK: ${غ}`);
    }

    انتظار db.چلائیں("DROP TABLE کھاتے");
    انتظار db.چلائیں("DROP DATABASE بینک");
    انتظار db.منقطع();
}

انتظار مرکز();

Savepoints Example — محفوظ نقطے مثال

Savepoints allow partial rollback within a transaction.

اردو: محفوظ نقطے (savepoints) لین دین کے اندر جزوی واپسی کی اجازت دیتے ہیں۔ آپ ایک خاص مقام محفوظ کریں، پھر اگر آگے کا کام ناکام ہو تو اسی مقام تک واپس جائیں — پچھلا کام محفوظ رہتا ہے۔

درآمد { پوسٹ_گریس } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن مرکز() {
    متغیر db = نیا پوسٹ_گریس({
        "میزبان": "localhost", "صارف": "postgres",
        "پاس_ورڈ": "پاس_ورڈ", "ڈیٹا_بیس": "postgres"
    });
    انتظار db.جوڑیں();

    انتظار db.چلائیں("DROP TABLE IF EXISTS سپ_جانچ");
    انتظار db.چلائیں(`CREATE TABLE سپ_جانچ (
        شناخت SERIAL PRIMARY KEY, قدر INT
    )`);

    // ─── SAVEPOINT استعمال ────────────────────────────
    انتظار db.لین_دین_شروع();

    انتظار db.چلائیں("INSERT INTO سپ_جانچ (قدر) VALUES (?)", [100]);
    انتظار db.نقطہ_محفوظ("نقطہ_الف");       // ← یہاں محفوظ

    انتظار db.چلائیں("INSERT INTO سپ_جانچ (قدر) VALUES (?)", [200]);
    انتظار db.نقطہ_محفوظ("نقطہ_ب");         // ← دوسرا نقطہ

    انتظار db.چلائیں("INSERT INTO سپ_جانچ (قدر) VALUES (?)", [999]);  // غلطی
    متغیر بعد_غلطی = انتظار db.سوال("SELECT COUNT(*) AS n FROM سپ_جانچ");
    لکھو(`غلطی سے پہلے: ${بعد_غلطی[0]["n"]} قطاریں`);

    // نقطہ_ب پر واپس — 999 والی قطار ختم
    انتظار db.نقطہ_واپسی("نقطہ_ب");
    متغیر بعد_واپسی = انتظار db.سوال("SELECT COUNT(*) AS n FROM سپ_جانچ");
    لکھو(`نقطہ_ب واپسی: ${بعد_واپسی[0]["n"]} قطاریں`);

    انتظار db.نقطہ_چھوڑیں("نقطہ_ب");  // نقطہ_ب ریلیز
    انتظار db.کمٹ();                    // نقطہ_الف تک محفوظ

    متغیر آخری = انتظار db.سوال("SELECT * FROM سپ_جانچ ORDER BY شناخت");
    لکھو(`\nآخری نتیجہ (${لمبائی(آخری)} قطاریں):`);
    کے_لیے (متغیر ق کا آخری) {
        لکھو(`  قدر: ${ق["قدر"]}`);
    }
    // صرف 100 اور 200 ہونے چاہئیں

    انتظار db.چلائیں("DROP TABLE سپ_جانچ");
    انتظار db.منقطع();
    لکھو("\nSavepoint مثال مکمل");
}

انتظار مرکز();

Savepoint workflow — محفوظ نقطہ کا طریقہ کار:

اردو: محفوظ نقطہ کا طریقہ کار: لین دین شروع کریں ← کام کریں ← نقطہ محفوظ کریں ← مزید کام کریں ← اگر ناکام ہو تو نقطے پر واپس جائیں ← نقطہ چھوڑیں ← کمٹ کریں۔

  1. await db.لین_دین_شروع() — begin transaction
  2. Do some work
  3. await db.نقطہ_محفوظ("نام") — save a checkpoint
  4. Do more work (that might fail)
  5. await db.نقطہ_واپسی("نام") — undo back to the checkpoint
  6. await db.نقطہ_چھوڑیں("نام") — release the savepoint
  7. await db.کمٹ() — commit everything up to the savepoints that were kept

SQLite (ایس_کیو_لائٹ) — ایس کیو لائٹ ڈیٹا بیس

SQLite is built into Python and requires no additional installation.

اردو: SQLite Python میں بنا ہوا ہے اور اضافی نصب کاری کی ضرورت نہیں۔ یہ ایک فائل پر مبنی ڈیٹا بیس ہے جو چھوٹی ایپلیکیشنز، جانچ اور سیکھنے کے لیے بہترین ہے۔ :memory: سے میموری میں عارضی ڈیٹا بیس بھی بنایا جا سکتا ہے۔

Import:

درآمد { ایس_کیو_لائٹ } سے "اردو/ڈیٹا_بیس";

Constructor:

// فائل میں
متغیر db = نیا ایس_کیو_لائٹ("میرا_ڈیٹا.db");

// یا ترتیب dict سے
متغیر db = نیا ایس_کیو_لائٹ({ "فائل": "میرا_ڈیٹا.db" });

// میموری میں (جانچ کے لیے)
متغیر db = نیا ایس_کیو_لائٹ(":memory:");

SQLite supports all common interface methods plus await db.جدول_بنائیں(نام, {col: type}).


SQLite Example: Quick Start

درآمد { ایس_کیو_لائٹ } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن مرکز() {
    متغیر db = نیا ایس_کیو_لائٹ(":memory:");
    انتظار db.جوڑیں();

    // جدول بنائیں
    انتظار db.جدول_بنائیں("اشیاء", {
        "شناخت": "INTEGER PRIMARY KEY AUTOINCREMENT",
        "نام":   "TEXT NOT NULL",
        "قیمت":  "REAL DEFAULT 0"
    });

    // داخل
    انتظار db.داخل("اشیاء", { "نام": "کتاب", "قیمت": 500.0 });
    انتظار db.داخل("اشیاء", { "نام": "قلم",  "قیمت": 50.0  });
    انتظار db.داخل("اشیاء", { "نام": "کاغذ", "قیمت": 20.0  });

    // تلاش
    متغیر سب = انتظار db.سوال("SELECT * FROM اشیاء ORDER BY قیمت DESC");
    کے_لیے (متغیر ش کا سب) {
        لکھو(`${ش["نام"]}: Rs ${ش["قیمت"]}`);
    }

    // Transaction
    انتظار db.لین_دین(غیر_متزامن فنکشن() {
        انتظار db.چلائیں("UPDATE اشیاء SET قیمت = قیمت * 1.1");
    });
    لکھو("\n10% قیمت اضافہ کامیاب");

    انتظار db.منقطع();
}

انتظار مرکز();

SQLite Example: Savepoints

درآمد { ایس_کیو_لائٹ } سے "اردو/ڈیٹا_بیس";

غیر_متزامن فنکشن مرکز() {
    متغیر db = نیا ایس_کیو_لائٹ(":memory:");
    انتظار db.جوڑیں();

    انتظار db.چلائیں(`CREATE TABLE کھاتے (
        شناخت INTEGER PRIMARY KEY AUTOINCREMENT,
        نام    TEXT NOT NULL,
        بقیہ   REAL DEFAULT 0
    )`);
    انتظار db.چلائیں("INSERT INTO کھاتے (نام, بقیہ) VALUES (?, ?)", ["احمد", 10000]);
    انتظار db.چلائیں("INSERT INTO کھاتے (نام, بقیہ) VALUES (?, ?)", ["فاطمہ", 5000]);

    // SAVEPOINT مثال
    انتظار db.لین_دین_شروع();

    // پہلا آپریشن
    انتظار db.چلائیں(
        "UPDATE کھاتے SET بقیہ = بقیہ - ? WHERE نام = ?", [2000, "احمد"]
    );
    انتظار db.چلائیں(
        "UPDATE کھاتے SET بقیہ = بقیہ + ? WHERE نام = ?", [2000, "فاطمہ"]
    );
    انتظار db.نقطہ_محفوظ("منتقلی_1");  // یہاں تک محفوظ

    // دوسرا آپریشن (جو ناکام ہو گا)
    انتظار db.چلائیں(
        "UPDATE کھاتے SET بقیہ = بقیہ - ? WHERE نام = ?", [9999, "احمد"]
    );

    // نقطہ پر واپس
    انتظار db.نقطہ_واپسی("منتقلی_1");
    انتظار db.نقطہ_چھوڑیں("منتقلی_1");
    انتظار db.کمٹ();

    // نتیجہ جانچیں
    متغیر نتیجہ = انتظار db.سوال(
        "SELECT نام, بقیہ FROM کھاتے ORDER BY شناخت"
    );
    کے_لیے (متغیر ک کا نتیجہ) {
        لکھو(`${ک["نام"]}: ${ک["بقیہ"]}`);
    }
    // احمد: 8000, فاطمہ: 7000 (صرف پہلی منتقلی)

    انتظار db.منقطع();
}

انتظار مرکز();

Factory Function (ڈیٹا_بیس_جوڑو) — فیکٹری فنکشن

Create any database connection by name using the factory function:

اردو: فیکٹری فنکشن ڈیٹا_بیس_جوڑو سے نام کے ذریعے کوئی بھی ڈیٹا بیس کنکشن بنائیں۔ پہلے دلیل میں ڈیٹا بیس کی قسم بتائیں ("mysql"، "postgresql"، "sqlite" وغیرہ) اور دوسرے میں ترتیب دیں۔

درآمد { ڈیٹا_بیس_جوڑو } سے "اردو/ڈیٹا_بیس";

// ترتیب سے قسم کا تعین
متغیر db = ڈیٹا_بیس_جوڑو("mysql", {
    "میزبان": "localhost",
    "صارف":   "root",
    "پاس_ورڈ": "",
    "ڈیٹا_بیس": "میری_ایپ"
});

انتظار db.جوڑیں();
// ...سب معمول کے طریقے کام کریں گے
انتظار db.منقطع();

Supported type strings: "mysql", "postgresql" / "postgres" / "pg", "sqlite", "mongodb", "firebase" / "firestore", "cassandra".


Complete Multi-Database Example

درآمد { مائی_ایس_کیو_ایل, مونگو_ڈی_بی, ایس_کیو_لائٹ } سے "اردو/ڈیٹا_بیس";

// ─── SQLite — میموری میں جانچ ───────────────────────────
غیر_متزامن فنکشن sqlite_جانچ() {
    لکھو("=== SQLite ===");
    متغیر db = نیا ایس_کیو_لائٹ(":memory:");
    انتظار db.جوڑیں();
    انتظار db.جدول_بنائیں("جانچ", {
        "id":  "INTEGER PRIMARY KEY AUTOINCREMENT",
        "val": "TEXT"
    });
    انتظار db.داخل("جانچ", { "val": "اردو" });
    متغیر r = انتظار db.سوال("SELECT * FROM جانچ");
    لکھو(`SQLite: ${r[0]["val"]}`);
    انتظار db.منقطع();
}

// ─── MongoDB — مجموعہ CRUD ───────────────────────────────
غیر_متزامن فنکشن mongo_جانچ() {
    لکھو("\n=== MongoDB ===");
    کوشش {
        متغیر mongo = نیا مونگو_ڈی_بی({ "ڈیٹا_بیس": "urdu_test" });
        انتظار mongo.جوڑیں();
        متغیر کول = mongo.مجموعہ("جانچ_کول");
        انتظار کول.حذف({});
        انتظار کول.داخل({ "زبان": "اردو", "نسخہ": 1 });
        متغیر ایک = انتظار کول.ایک_تلاش({ "زبان": "اردو" });
        لکھو(`MongoDB: ${ایک["زبان"]} v${ایک["نسخہ"]}`);
        انتظار کول.حذف({});
        انتظار mongo.منقطع();
    } پکڑو (غ) {
        لکھو(`MongoDB چھوڑا: ${غ}`);
    }
}

غیر_متزامن فنکشن مرکز() {
    انتظار sqlite_جانچ();
    انتظار mongo_جانچ();
    لکھو("\nتمام جانچ مکمل");
}

انتظار مرکز();