کتابخانه‌ی استاندارد · پایگاه داده

اس کیو لایت db/sqlite

پایگاه داده‌ی SQLite در یک پرونده یا در حافظه.

واردسازی دیتابیس.اس کیو لایت

SQLite پایگاه داده‌ای است که در یک پرونده جا می‌شود و سرور لازم ندارد؛ برای برنامه‌های رومیزی، ابزارها و بسیاری از سایت‌ها کافی است. برنامه به کتابخانه‌ی sqlite3 سیستم پیوند می‌خورد، پس این کتابخانه باید جایی که برنامه اجرا می‌شود نصب باشد (تقریبا روی همه‌ی سیستم‌های لینوکس و مک از پیش هست).

دو راه کار هست: تابع‌های این بسته، مثل پرسمان و بعدی، که به همه‌ی امکانات SQLite می‌رسند؛ یا متدهای پایگاه داده و ردیف‌ها و اتصال که همان رابط مشترک دیتابیس است. مقدارهای کاربر را با آماده سازی و تابع‌های اتصال ... بفرستید، نه با چسباندن به متن SQL.

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

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

گام‌های زیر پایگاه داده‌ی یک کتابخانه‌ی امانی کوچک را می‌سازند: کتاب‌ها، عضوها و امانت‌ها. هر گام یک برنامه‌ی کامل است و خروجی زیر آن همان چیزی است که با SQLite نسخه‌ی ۳.۴۶ چاپ کرد. گام‌ها را به ترتیب و در یک پوشه اجرا کنید، چون همه همان پرونده‌ی library.db را باز می‌کنند و از چیزی که گام‌های قبل در آن گذاشته‌اند استفاده می‌کنند. برای شروع دوباره، library.db و دو پرونده‌ی library.db-wal و library.db-shm کنار آن را پاک کنید.

لازم نیست چیزی را از قبل راه بیندازید. اگر برنامه هنگام پیوند با پیامی درباره‌ی sqlite3 شکست خورد، کتابخانه را نصب کنید: در دبیان و اوبونتو sudo apt install libsqlite3-dev، در فدورا sudo dnf install sqlite-devel و در مک brew install sqlite.

۱. باز کردن پایگاه داده و تنظیم گزینه‌ها

بازکردن پرونده‌ای را باز می‌کند و اگر نباشد آن را می‌سازد. :memory: (یا مسیر خالی) یک پایگاه داده‌ی خصوصی در حافظه می‌دهد که با بستن از بین می‌رود؛ برای آزمون و حافظه‌ی نهان به کار می‌آید. SQLite رشته‌ی اتصال ندارد: گزینه‌ها دستورهای PRAGMA هستند که پس از باز کردن اجرا می‌کنید. سه تا از آن‌ها تقریبا در هر برنامه‌ای ارزش تنظیم دارند. journal_mode = WAL می‌گذارد خواننده‌ها هم‌زمان با کار یک نویسنده بخوانند و در خود پرونده ذخیره می‌شود، پس یک بار کافی است. foreign_keys = ON باعث می‌شود SQLite قیدهای REFERENCES را اجرا کند؛ به طور پیش‌فرض خاموش است و مال اتصال است، پس هر برنامه‌ای که پرونده را باز می‌کند باید دوباره روشنش کند. busy_timeout اتصال را وادار می‌کند به اندازه‌ی این چند میلی‌ثانیه برای قفل صبر کند و فورا شکست نخورد.

db-sqlite-open.salam
واردسازی دیتابیس.اس کیو لایت
واردسازی رشته

تابع ریشه:
    اگر وارونه اس کیو لایت.در دسترس():
        سرچاپ "SQLite نصب نیست"
        برگشت ۱
    پایان
    سرچاپ "SQLite 3:"، رشته.شروع با(اس کیو لایت.نسخه()، "3.")

    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)
    اگر وارونه اس کیو لایت.معتبر(پایگاه) یا اس کیو لایت.اجرا(پایگاه، "SELECT 1") نابرابر ۰:
        سرچاپ "باز نشد:"، اس کیو لایت.خطا(پایگاه)
        برگشت ۱
    پایان

    سرچاپ "ژورنال:"، اس کیو لایت.پرسمان متن(پایگاه، "PRAGMA journal_mode = WAL")
    اس کیو لایت.اجرا(پایگاه، "PRAGMA foreign_keys = ON")
    سرچاپ "کلید خارجی:"، اس کیو لایت.پرسمان عدد(پایگاه، "PRAGMA foreign_keys")
    سرچاپ "زمان انتظار قفل:"، اس کیو لایت.پرسمان عدد(پایگاه، "PRAGMA busy_timeout = 5000")

    خراب := اس کیو لایت.بازکردن("/no/such/folder/library.db")
    سرچاپ "مسیر نادرست، دستگیره:"، اس کیو لایت.معتبر(خراب)، "| نخستین دستور:"، اس کیو لایت.اجرا(خراب، "SELECT 1")، اس کیو لایت.خطا(خراب)
    اس کیو لایت.بستن(خراب)
پایان
خروجیSQLite 3: true ژورنال: wal کلید خارجی: 1 زمان انتظار قفل: 5000 مسیر نادرست، دستگیره: true | نخستین دستور: -1 unable to open database file

به سطر آخر نگاه کنید. SQLite حتی وقتی پرونده باز نمی‌شود هم دستگیره برمی‌گرداند، پس معتبر درست است و مشکل تازه با شکست نخستین دستور پیدا می‌شود. برای همین این گام پیش از اعتماد به پایگاه داده SELECT 1 را اجرا می‌کند.

۲. ساخت جدول‌ها

اجرا یک یا چند دستور جداشده با نقطه‌ویرگول را اجرا می‌کند و در صورت موفقیت ۰ و در صورت شکست ۱- برمی‌گرداند و دلیل را در خطا نگه می‌دارد. رشته‌ی سه‌گیومه‌ای یک طرح بلند را خوانا نگه می‌دارد. IF NOT EXISTS اجرای دوباره‌ی گام را بی‌خطر می‌کند و PRAGMA user_version یک عدد آزاد در سرآیند پرونده است که برای نسخه‌ی طرح به کار می‌آید (گام ۱۱ به‌جای آن از جدول مهاجرت استفاده می‌کند).

db-sqlite-schema.salam
واردسازی دیتابیس.اس کیو لایت

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)

    طرح := """
    CREATE TABLE IF NOT EXISTS books (
        id INTEGER PRIMARY KEY,
        title TEXT NOT NULL,
        author TEXT NOT NULL,
        year INTEGER,
        copies INTEGER NOT NULL DEFAULT 1 CHECK (copies >= 0),
        rating REAL,
        note TEXT
    );
    CREATE TABLE IF NOT EXISTS members (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL UNIQUE,
        email TEXT
    );
    CREATE TABLE IF NOT EXISTS loans (
        id INTEGER PRIMARY KEY,
        book INTEGER NOT NULL REFERENCES books (id),
        member INTEGER NOT NULL REFERENCES members (id),
        due TEXT NOT NULL,
        returned TEXT
    );
    CREATE INDEX IF NOT EXISTS books_author ON books (author);
    PRAGMA user_version = 1;
    """
    اگر اس کیو لایت.اجرا(پایگاه، طرح) نابرابر ۰:
        سرچاپ "ساخت جدول‌ها شکست خورد:"، اس کیو لایت.خطا(پایگاه)
        برگشت ۱
    پایان

    ردیف‌ها := اس کیو لایت.پرسمان(پایگاه، "SELECT type, name FROM sqlite_master ORDER BY type, name")
    تا اس کیو لایت.بعدی(ردیف‌ها):
        سرچاپ اس کیو لایت.متن(ردیف‌ها، ۰)، اس کیو لایت.متن(ردیف‌ها، ۱)
    پایان
    اس کیو لایت.پایان(ردیف‌ها)
    سرچاپ "نسخه‌ی طرح:"، اس کیو لایت.پرسمان عدد(پایگاه، "PRAGMA user_version")
پایان
خروجیindex books_author index sqlite_autoindex_members_1 table books table loans table members نسخه‌ی طرح: 1

نوع‌ها در SQLite سخت‌گیر نیستند: ستونی که INTEGER تعریف شده، اگر متن بدهید متن نگه می‌دارد. چیزی که واقعا داده را تمیز نگه می‌دارد قیدهایی مثل NOT NULL، UNIQUE و CHECK است. ستون INTEGER PRIMARY KEY همان شناسه‌ی ردیف است و هنگام درج خودش پر می‌شود.

۳. درج ردیف‌ها

آماده سازی دستوری با جاهای ? را یک بار ترجمه می‌کند؛ تابع‌های اتصال ... جاها را پر می‌کنند (شماره از ۱)، بعدی آن را اجرا می‌کند و بازنشانی آن را برای ردیف بعدی آماده می‌کند. یک بار آماده کردن و چند بار پر کردن، هم سریع‌تر است و هم امن‌تر از ساختن رشته‌ی SQL تازه برای هر ردیف. شناسه آخرین درج شناسه‌ای را که SQLite انتخاب کرد می‌دهد و تعداد تغییرات شمار ردیف‌هایی را که آخرین دستور تغییر داد.

db-sqlite-insert.salam
واردسازی دیتابیس.اس کیو لایت

ساختار کتاب:
    همگانی عنوان: رشته = ""
    همگانی نویسنده: رشته = ""
    همگانی سال: صحیح = ۰
    همگانی نسخه‌ها: صحیح = ۱
    همگانی امتیاز: اعشار۶۴ = ۰.۰
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)

    ناپایا کتاب‌ها := وکتور {} برگردان وکتور<کتاب>
    دیرکن کتاب‌ها.آزادکن()
    کتاب‌ها.بیفزا(کتاب { عنوان = "بوف کور"، نویسنده = "صادق هدایت"، سال = ۱۳۱۵، نسخه‌ها = ۲، امتیاز = ۴.۵ })
    کتاب‌ها.بیفزا(کتاب { عنوان = "سووشون"، نویسنده = "سیمین دانشور"، سال = ۱۳۴۸، امتیاز = ۴.۱ })
    کتاب‌ها.بیفزا(کتاب { عنوان = "جزیره سرگردانی"، نویسنده = "سیمین دانشور"، سال = ۱۳۷۲، امتیاز = ۴.۳ })
    کتاب‌ها.بیفزا(کتاب { عنوان = "کلیدر"، نویسنده = "محمود دولت‌آبادی"، سال = ۱۳۵۷، نسخه‌ها = ۳، امتیاز = ۴.۶ })
    کتاب‌ها.بیفزا(کتاب { عنوان = "شازده کوچولو"، نویسنده = "آنتوان دو سنت‌اگزوپری"، سال = ۱۳۲۲، امتیاز = ۳.۹ })

    دستور := اس کیو لایت.آماده سازی(پایگاه، "INSERT INTO books (title, author, year, copies, rating) VALUES (?, ?, ?, ?, ?)")
    دیرکن اس کیو لایت.پایان(دستور)
    هر ک در کتاب‌ها:
        اس کیو لایت.بازنشانی(دستور)
        اس کیو لایت.اتصال متن(دستور، ۱، ک.عنوان)
        اس کیو لایت.اتصال متن(دستور، ۲، ک.نویسنده)
        اس کیو لایت.اتصال عدد(دستور، ۳، ک.سال برگردان صحیح۶۴)
        اس کیو لایت.اتصال عدد(دستور، ۴، ک.نسخه‌ها برگردان صحیح۶۴)
        اس کیو لایت.اتصال اعشار(دستور، ۵، ک.امتیاز)
        اس کیو لایت.بعدی(دستور)
        سرچاپ "کتاب"، اس کیو لایت.شناسه آخرین درج(پایگاه)، ک.عنوان
    پایان

    اس کیو لایت.اجرا(پایگاه، "INSERT INTO members (name, email) VALUES ('سارا', '[email protected]'), ('رضا', NULL), ('مینا', '[email protected]')")
    سرچاپ "عضو افزوده شد:"، اس کیو لایت.تعداد تغییرات(پایگاه)
    سرچاپ "کتاب‌ها:"، اس کیو لایت.پرسمان عدد(پایگاه، "SELECT COUNT(*) FROM books")، "نسخه‌ها:"، اس کیو لایت.پرسمان عدد(پایگاه، "SELECT SUM(copies) FROM books")
پایان
خروجیکتاب 1 بوف کور کتاب 2 سووشون کتاب 3 جزیره سرگردانی کتاب 4 کلیدر کتاب 5 شازده کوچولو عضو افزوده شد: 3 کتاب‌ها: 5 نسخه‌ها: 8

اتصال عدد یک صحیح۶۴ می‌گیرد، پس فیلد صحیح با برگردان صحیح۶۴ تبدیل می‌شود. دستور با پایان آزاد می‌شود و دیرکن مطمئن می‌شود که تابع هر طور تمام شود این کار انجام می‌شود.

۴. خواندن ردیف‌ها در ساختارهای خودتان

پرسمان هم یک دستور است: بعدی به ردیف بعدی می‌رود و وقتی ردیفی نماند نادرست برمی‌گرداند، و متن، عدد صحیح، عدد صحیح۶۴ و عدد اعشار ستون‌های ردیف جاری را با شماره‌شان می‌خوانند که از ۰ شروع می‌شود. خواندن یک ردیف را در تابعی کوچک بگذارید تا هر پرسمانی که همان ستون‌ها را انتخاب می‌کند از آن استفاده کند.

db-sqlite-structs.salam
واردسازی دیتابیس.اس کیو لایت

ساختار کتاب:
    همگانی شناسه: صحیح۶۴ = ۰
    همگانی عنوان: رشته = ""
    همگانی نویسنده: رشته = ""
    همگانی سال: صحیح = ۰
    همگانی نسخه‌ها: صحیح = ۰
    همگانی امتیاز: اعشار۶۴ = ۰.۰
پایان

تابع خواندن کتاب(ردیف‌ها: اس کیو لایت.ردیف ها): کتاب:
    برگشت کتاب {
        شناسه = اس کیو لایت.عدد صحیح۶۴(ردیف‌ها، ۰)،
        عنوان = اس کیو لایت.متن(ردیف‌ها، ۱)،
        نویسنده = اس کیو لایت.متن(ردیف‌ها، ۲)،
        سال = اس کیو لایت.عدد صحیح(ردیف‌ها، ۳)،
        نسخه‌ها = اس کیو لایت.عدد صحیح(ردیف‌ها، ۴)،
        امتیاز = اس کیو لایت.عدد اعشار(ردیف‌ها، ۵)
    }
پایان

تابع کتاب‌های نویسنده(پایگاه: اس کیو لایت.پایگاه داده، نام: رشته): وکتور<کتاب>:
    ناپایا خروجی := وکتور {} برگردان وکتور<کتاب>
    دستور := اس کیو لایت.آماده سازی(پایگاه، "SELECT id, title, author, year, copies, rating FROM books WHERE author = ? ORDER BY year")
    دیرکن اس کیو لایت.پایان(دستور)
    اس کیو لایت.اتصال متن(دستور، ۱، نام)
    تا اس کیو لایت.بعدی(دستور):
        خروجی.بیفزا(خواندن کتاب(دستور))
    پایان
    برگشت خروجی
پایان

تابع کتاب با شناسه(پایگاه: اس کیو لایت.پایگاه داده، شناسه: صحیح۶۴، پیدا شد &: منطقی): کتاب:
    دستور := اس کیو لایت.آماده سازی(پایگاه، "SELECT id, title, author, year, copies, rating FROM books WHERE id = ?")
    دیرکن اس کیو لایت.پایان(دستور)
    اس کیو لایت.اتصال عدد(دستور، ۱، شناسه)
    پیدا شد = اس کیو لایت.بعدی(دستور)
    اگر وارونه پیدا شد:
        برگشت کتاب {}
    پایان
    برگشت خواندن کتاب(دستور)
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)

    دانشور := کتاب‌های نویسنده(پایگاه، "سیمین دانشور")
    دیرکن دانشور.آزادکن()
    هر ک در دانشور:
        سرچاپ ک.شناسه، ک.عنوان، ک.سال، ک.امتیاز
    پایان

    ناپایا پیدا شد := نادرست
    ک := کتاب با شناسه(پایگاه، ۴، پیدا شد)
    سرچاپ پیدا شد، ک.عنوان، "از"، ک.نویسنده + "،"، ک.نسخه‌ها، "نسخه"
    کتاب با شناسه(پایگاه، ۹۹، پیدا شد)
    سرچاپ "کتاب ۹۹ پیدا شد:"، پیدا شد
پایان
خروجی2 سووشون 1348 4.1 3 جزیره سرگردانی 1372 4.3 true کلیدر از محمود دولت‌آبادی، 3 نسخه کتاب ۹۹ پیدا شد: false

شناسه‌ها صحیح۶۴ هستند؛ آن‌ها را با عدد صحیح۶۴ بخوانید. عدد صحیح ۳۲ بیتی است و عددهای بزرگ را خراب می‌کند. وقتی ممکن است جستجو چیزی پیدا نکند، این را جدا گزارش کنید (این‌جا با پارامتر پیدا شد)، نه با برگرداندن ساختاری خالی که شبیه یک کتاب واقعی است.

۵. پارامترها و تزریق SQL

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

db-sqlite-params.salam
واردسازی دیتابیس.اس کیو لایت

تابع جستجو(پایگاه: اس کیو لایت.پایگاه داده، نوشته: رشته):
    دستور := اس کیو لایت.آماده سازی(پایگاه، "SELECT title FROM books WHERE title LIKE '%' || ? || '%' ORDER BY title")
    دیرکن اس کیو لایت.پایان(دستور)
    اس کیو لایت.اتصال متن(دستور، ۱، نوشته)
    ناپایا یافته‌ها := ۰
    تا اس کیو لایت.بعدی(دستور):
        یافته‌ها = یافته‌ها + ۱
    پایان
    سرچاپ "جستجوی"، پایگاه.نقل قول(نوشته) + ":"، یافته‌ها، "نتیجه"
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)

    جستجو(پایگاه، "و")
    جستجو(پایگاه، "x' OR '1'='1")

    چسبانده := "SELECT COUNT(*) FROM books WHERE title = 'x' OR '1'='1'"
    سرچاپ "چسبانده در SQL:"، اس کیو لایت.پرسمان عدد(پایگاه، چسبانده)، "کتاب"

    دستور := اس کیو لایت.آماده سازی(پایگاه، "INSERT INTO members (name, email) VALUES (?, ?)")
    اس کیو لایت.اتصال متن(دستور، ۱، "نیلوفر 'نیلی' احمدی")
    اس کیو لایت.اتصال متن(دستور، ۲، "[email protected]")
    اس کیو لایت.بعدی(دستور)
    اس کیو لایت.پایان(دستور)
    سرچاپ "عضو تازه"، اس کیو لایت.شناسه آخرین درج(پایگاه)

    نام := "نیلوفر 'نیلی' احمدی"
    اگر اس کیو لایت.اجرا(پایگاه، "UPDATE members SET email = NULL WHERE name = '" + نام + "'") نابرابر ۰:
        سرچاپ "نام چسبانده:"، اس کیو لایت.خطا(پایگاه)
    پایان
    سرچاپ "با نقل قول:"، اس کیو لایت.پرسمان عدد(پایگاه، "SELECT COUNT(*) FROM members WHERE name = " + پایگاه.نقل قول(نام))
پایان
خروجیجستجوی 'و': 3 نتیجه جستجوی 'x'' OR ''1''=''1': 0 نتیجه چسبانده در SQL: 5 کتاب عضو تازه 4 نام چسبانده: near "نیلی": syntax error با نقل قول: 1

برای هر مقداری که از بیرون برنامه می‌آید پارامتر به کار ببرید. متد نقل قول پایگاه داده (از رابط مشترک دیتابیس) متن را در گیومه می‌گذارد و گیومه‌های درون آن را دوتایی می‌کند؛ آن را برای جای کمیابی نگه دارید که مقدار نمی‌تواند پارامتر باشد، مثل SQL که برای ابزار دیگری تولید می‌کنید. نام جدول و ستون اصلا نمی‌تواند پارامتر باشد، پس آن را از فهرستی ثابت در کد خودتان انتخاب کنید.

۶. مقدارهای NULL

مقدار نبوده در SQL همان NULL است که با رشته‌ی خالی یا صفر یکی نیست. اتصال خالی آن را ذخیره می‌کند و خالی است می‌گوید ستونی آن را دارد. متن برای NULL رشته‌ی "" و عدد صحیح و عدد اعشار صفر برمی‌گردانند، پس هر جا خالی و نبوده معنای جدا دارند، اول خالی است را بپرسید یا بگذارید SQL با COALESCE مقدار پیش‌فرض بگذارد.

db-sqlite-null.salam
واردسازی دیتابیس.اس کیو لایت

تابع اتصال اختیاری(دستور: اس کیو لایت.ردیف ها، جا: صحیح، مقدار: رشته):
    اگر مقدار برابر "":
        اس کیو لایت.اتصال خالی(دستور، جا)
    وگرنه:
        اس کیو لایت.اتصال متن(دستور، جا، مقدار)
    پایان
پایان

تابع ثبت یادداشت(پایگاه: اس کیو لایت.پایگاه داده، شناسه: صحیح۶۴، یادداشت: رشته):
    دستور := اس کیو لایت.آماده سازی(پایگاه، "UPDATE books SET note = ? WHERE id = ?")
    دیرکن اس کیو لایت.پایان(دستور)
    اتصال اختیاری(دستور، ۱، یادداشت)
    اس کیو لایت.اتصال عدد(دستور، ۲، شناسه)
    اس کیو لایت.بعدی(دستور)
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)

    ثبت یادداشت(پایگاه، ۱، "با امضای نویسنده")
    ثبت یادداشت(پایگاه، ۴، "")

    ردیف‌ها := اس کیو لایت.پرسمان(پایگاه، "SELECT title, note FROM books WHERE id IN (1, 4)")
    تا اس کیو لایت.بعدی(ردیف‌ها):
        اگر اس کیو لایت.خالی است(ردیف‌ها، ۱):
            سرچاپ اس کیو لایت.متن(ردیف‌ها، ۰) + ": یادداشت ندارد، متن می‌دهد \"" + اس کیو لایت.متن(ردیف‌ها، ۱) + "\""
        وگرنه:
            سرچاپ اس کیو لایت.متن(ردیف‌ها، ۰) + ":"، اس کیو لایت.متن(ردیف‌ها، ۱)
        پایان
    پایان
    اس کیو لایت.پایان(ردیف‌ها)

    رایانامه‌ها := اس کیو لایت.پرسمان(پایگاه، "SELECT name, COALESCE(email, '(بی‌رایانامه)') FROM members ORDER BY id")
    تا اس کیو لایت.بعدی(رایانامه‌ها):
        سرچاپ اس کیو لایت.متن(رایانامه‌ها، ۰)، اس کیو لایت.متن(رایانامه‌ها، ۱)
    پایان
    اس کیو لایت.پایان(رایانامه‌ها)
    سرچاپ "بدون رایانامه:"، اس کیو لایت.پرسمان عدد(پایگاه، "SELECT COUNT(*) FROM members WHERE email IS NULL")
پایان
خروجیبوف کور: با امضای نویسنده کلیدر: یادداشت ندارد، متن می‌دهد "" سارا [email protected] رضا (بی‌رایانامه) مینا [email protected] نیلوفر 'نیلی' احمدی [email protected] بدون رایانامه: 1

۷. تراکنش‌ها

امانت دادن یک کتاب دو نوشتن است: یک نسخه کمتر در قفسه و یک ردیف تازه در loans. این دو باید با هم انجام شوند یا هیچ‌کدام. شروع تراکنش تراکنش را آغاز می‌کند، ثبت تراکنش همه‌ی تغییرهای آن را یک‌جا ماندگار می‌کند و بازگردانی همه را دور می‌ریزد. هر تابع کمکی گزارش می‌دهد که آیا دقیقا یک ردیف تغییر کرد، پس کتابی که نسخه‌ای از آن نمانده یا عضوی ناشناخته کل امانت را برمی‌گرداند.

db-sqlite-tx.salam
واردسازی دیتابیس.اس کیو لایت

تابع گام(پایگاه: اس کیو لایت.پایگاه داده، پرسش: رشته، الف: صحیح۶۴، ب: صحیح۶۴، سررسید: رشته): منطقی:
    دستور := اس کیو لایت.آماده سازی(پایگاه، پرسش)
    اس کیو لایت.اتصال عدد(دستور، ۱، الف)
    اگر ب بزرگتر ۰:
        اس کیو لایت.اتصال عدد(دستور، ۲، ب)
        اس کیو لایت.اتصال متن(دستور، ۳، سررسید)
    پایان
    اس کیو لایت.بعدی(دستور)
    برگشت اس کیو لایت.پایان(دستور) برابر ۰ و اس کیو لایت.تعداد تغییرات(پایگاه) برابر ۱
پایان

تابع امانت(پایگاه: اس کیو لایت.پایگاه داده، کتاب: صحیح۶۴، عضو: صحیح۶۴، امروز: رشته): منطقی:
    اگر اس کیو لایت.شروع تراکنش(پایگاه) نابرابر ۰:
        برگشت نادرست
    پایان
    اگر وارونه گام(پایگاه، "UPDATE books SET copies = copies - 1 WHERE id = ? AND copies > 0"، کتاب، ۰، ""):
        اس کیو لایت.بازگردانی(پایگاه)
        برگشت نادرست
    پایان
    اگر وارونه گام(پایگاه، "INSERT INTO loans (book, member, due) VALUES (?, ?, date(?, '+14 days'))"، کتاب، عضو، امروز):
        اس کیو لایت.بازگردانی(پایگاه)
        برگشت نادرست
    پایان
    برگشت اس کیو لایت.ثبت تراکنش(پایگاه) برابر ۰
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)
    اس کیو لایت.اجرا(پایگاه، "PRAGMA foreign_keys = ON")
    امروز := "2026-10-17"

    سرچاپ "سارا سووشون را می‌برد:"، امانت(پایگاه، ۲، ۱، امروز)
    سرچاپ "رضا سووشون را می‌برد:"، امانت(پایگاه، ۲، ۲، امروز)
    سرچاپ "مینا بوف کور را می‌برد:"، امانت(پایگاه، ۱، ۳، امروز)
    سرچاپ "مینا کلیدر را می‌برد:"، امانت(پایگاه، ۴، ۳، "2026-10-20")
    سرچاپ "عضو ۴۲ بوف کور را می‌برد:"، امانت(پایگاه، ۱، ۴۲، امروز)

    سرچاپ "نسخه‌های بوف کور:"، اس کیو لایت.پرسمان عدد(پایگاه، "SELECT copies FROM books WHERE id = 1")
    سرچاپ "امانت‌ها:"، اس کیو لایت.پرسمان عدد(پایگاه، "SELECT COUNT(*) FROM loans")
    سرچاپ "سررسید کتاب سارا:"، اس کیو لایت.پرسمان متن(پایگاه، "SELECT due FROM loans WHERE member = 1")
پایان
خروجیسارا سووشون را می‌برد: true رضا سووشون را می‌برد: false مینا بوف کور را می‌برد: true مینا کلیدر را می‌برد: true عضو ۴۲ بوف کور را می‌برد: false نسخه‌های بوف کور: 1 امانت‌ها: 3 سررسید کتاب سارا: 2026-10-31

تاریخ سررسید را تابع date() خود SQLite حساب می‌کند. تراکنش راه سریع کردن درج انبوه هم هست: SQLite برای هر تراکنش یک بار روی دیسک می‌نویسد، پس هزار درج درون یک شروع تراکنش و ثبت تراکنش کسری از زمان هزار درج جدا را می‌گیرد.

۸. ویرایش و حذف

UPDATE و DELETE مثل هر SQL دیگری با اجرا یا دستور آماده اجرا می‌شوند. تعداد تغییرات می‌گوید آخرین دستور به چند ردیف دست زد؛ برنامه از همین راه می‌فهمد که یک UPDATE ... WHERE با هیچ ردیفی جور نشد. مجموع تغییرات همه‌ی ردیف‌هایی را می‌شمارد که از زمان باز شدن پایگاه داده تغییر کرده‌اند.

db-sqlite-update.salam
واردسازی دیتابیس.اس کیو لایت

تابع بازپس دادن(پایگاه: اس کیو لایت.پایگاه داده، امانت: صحیح۶۴، روز: رشته): منطقی:
    اس کیو لایت.شروع تراکنش(پایگاه)
    دستور := اس کیو لایت.آماده سازی(پایگاه، "UPDATE loans SET returned = ? WHERE id = ? AND returned IS NULL")
    اس کیو لایت.اتصال متن(دستور، ۱، روز)
    اس کیو لایت.اتصال عدد(دستور، ۲، امانت)
    اس کیو لایت.بعدی(دستور)
    اس کیو لایت.پایان(دستور)
    اگر اس کیو لایت.تعداد تغییرات(پایگاه) نابرابر ۱:
        اس کیو لایت.بازگردانی(پایگاه)
        برگشت نادرست
    پایان
    برگرداندن := اس کیو لایت.آماده سازی(پایگاه، "UPDATE books SET copies = copies + 1 WHERE id = (SELECT book FROM loans WHERE id = ?)")
    اس کیو لایت.اتصال عدد(برگرداندن، ۱، امانت)
    اس کیو لایت.بعدی(برگرداندن)
    اس کیو لایت.پایان(برگرداندن)
    برگشت اس کیو لایت.ثبت تراکنش(پایگاه) برابر ۰
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)
    تغییرات پیشین := اس کیو لایت.مجموع تغییرات(پایگاه)

    سرچاپ "امانت ۱ برگشت:"، بازپس دادن(پایگاه، ۱، "2026-10-25")
    سرچاپ "امانت ۱ دوباره:"، بازپس دادن(پایگاه، ۱، "2026-10-26")
    سرچاپ "نسخه‌های سووشون:"، اس کیو لایت.پرسمان عدد(پایگاه، "SELECT copies FROM books WHERE id = 2")

    اس کیو لایت.اجرا(پایگاه، "UPDATE books SET rating = rating + 0.1 WHERE author = 'سیمین دانشور'")
    سرچاپ "امتیاز تازه:"، اس کیو لایت.تعداد تغییرات(پایگاه)

    اس کیو لایت.اجرا(پایگاه، "DELETE FROM members WHERE id NOT IN (SELECT member FROM loans)")
    سرچاپ "عضوهای بی‌امانت حذف شدند:"، اس کیو لایت.تعداد تغییرات(پایگاه)
    سرچاپ "ردیف‌های تغییرکرده در این برنامه:"، اس کیو لایت.مجموع تغییرات(پایگاه) - تغییرات پیشین
پایان
خروجیامانت ۱ برگشت: true امانت ۱ دوباره: false نسخه‌های سووشون: 1 امتیاز تازه: 2 عضوهای بی‌امانت حذف شدند: 2 ردیف‌های تغییرکرده در این برنامه: 6

بازگرداندن دوباره‌ی یک امانت به خاطر returned IS NULL در بخش WHERE شکست می‌خورد: شرط بررسی را انجام می‌دهد و تعداد تغییرات نتیجه را گزارش می‌کند.

۹. خطاها

هر تابع شکست را در مقدار برگشتی‌اش گزارش می‌کند و دلیل را در خطا نگه می‌دارد. اشتباه در خود SQL فورا پیدا می‌شود: آماده سازی دستوری برمی‌گرداند که دستور معتبر برایش نادرست است. شکستن یک قید هنگام اجرای دستور پیدا می‌شود: بعدی نادرست برمی‌گرداند (درست مثل پایان ردیف‌ها) و پایان یا بازنشانی ۱- برمی‌گرداند. برای جدا کردن این دو حالت، مقدار پایان را بررسی کنید.

db-sqlite-errors.salam
واردسازی دیتابیس.اس کیو لایت

تابع درج(پایگاه: اس کیو لایت.پایگاه داده، پرسش: رشته، الف: رشته، ب: صحیح۶۴): منطقی:
    دستور := اس کیو لایت.آماده سازی(پایگاه، پرسش)
    اگر وارونه اس کیو لایت.دستور معتبر(دستور):
        سرچاپ "  آماده نشد:"، اس کیو لایت.خطا(پایگاه)
        برگشت نادرست
    پایان
    اس کیو لایت.اتصال متن(دستور، ۱، الف)
    اس کیو لایت.اتصال عدد(دستور، ۲، ب)
    تمام := وارونه اس کیو لایت.بعدی(دستور)
    اگر اس کیو لایت.پایان(دستور) نابرابر ۰:
        سرچاپ "  شکست خورد:"، اس کیو لایت.خطا(پایگاه)
        برگشت نادرست
    پایان
    برگشت تمام
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)
    اس کیو لایت.اجرا(پایگاه، "PRAGMA foreign_keys = ON")

    سرچاپ "سارای دوم:"
    درج(پایگاه، "INSERT INTO members (name, id) VALUES (?, ?)"، "سارا"، ۵۰)
    سرچاپ "امانت برای کتاب ۹۹:"
    درج(پایگاه، "INSERT INTO loans (due, book, member) VALUES (?, ?, 1)"، "2026-11-01"، ۹۹)
    سرچاپ "نسخه‌ی منفی:"
    درج(پایگاه، "INSERT INTO books (title, copies, author) VALUES (?, ?, 'هیچ‌کس')"، "شبح"، -۱)
    سرچاپ "غلط تایپی در SQL:"
    درج(پایگاه، "INSERT INTO bokks (title, year) VALUES (?, ?)"، "شبح"، ۱۴۰۵)

    اگر اس کیو لایت.اجرا(پایگاه، "DELETE FROM books WHERE id = 2") نابرابر ۰:
        سرچاپ "حذف سووشون:"، اس کیو لایت.خطا(پایگاه)
    پایان
    سرچاپ "سووشون هنوز هست:"، اس کیو لایت.پرسمان متن(پایگاه، "SELECT title FROM books WHERE id = 2")
پایان
خروجیسارای دوم: شکست خورد: UNIQUE constraint failed: members.name امانت برای کتاب ۹۹: شکست خورد: FOREIGN KEY constraint failed نسخه‌ی منفی: شکست خورد: CHECK constraint failed: copies >= 0 غلط تایپی در SQL: آماده نشد: no such table: bokks حذف سووشون: FOREIGN KEY constraint failed سووشون هنوز هست: سووشون

خطا را درست پس از فراخوانی شکست‌خورده بخوانید، چون دستور بعدی پیام را عوض می‌کند. پیام‌های SQLite انگلیسی‌اند و نام قید را می‌گویند و همین برای ساختن پیامی برای کاربر کافی است (UNIQUE constraint failed: members.name یعنی این نام پیش‌تر گرفته شده است).

۱۰. گزارش با پیوند و گروه‌بندی

بیشتر کار یک گزارش با SQL است. JOIN ردیف‌های مرتبط را کنار هم می‌آورد، GROUP BY با COUNT، SUM و AVG آن‌ها را خلاصه می‌کند و تابع‌های JSON خود SQLite می‌توانند پاسخ JSON یک API وب را در یک پرسمان بسازند که با پرسمان متن خوانده می‌شود.

db-sqlite-report.salam
واردسازی دیتابیس.اس کیو لایت

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)

    بیرون := اس کیو لایت.پرسمان(پایگاه، """
        SELECT m.name, b.title, l.due
        FROM loans l
        JOIN books b ON b.id = l.book
        JOIN members m ON m.id = l.member
        WHERE l.returned IS NULL
        ORDER BY l.due, m.name""")
    سرچاپ "در امانت:"
    تا اس کیو لایت.بعدی(بیرون):
        سرچاپ " "، اس کیو لایت.متن(بیرون، ۰)، "کتاب"، اس کیو لایت.متن(بیرون، ۱)، "را تا"، اس کیو لایت.متن(بیرون، ۲)، "دارد"
    پایان
    اس کیو لایت.پایان(بیرون)

    دیرکرد := اس کیو لایت.آماده سازی(پایگاه، "SELECT COUNT(*) FROM loans WHERE returned IS NULL AND due < ?")
    اس کیو لایت.اتصال متن(دیرکرد، ۱، "2026-11-01")
    اس کیو لایت.بعدی(دیرکرد)
    سرچاپ "دیرکرد در 2026-11-01:"، اس کیو لایت.عدد صحیح(دیرکرد، ۰)
    اس کیو لایت.پایان(دیرکرد)

    نویسندگان := اس کیو لایت.پرسمان(پایگاه، """
        SELECT author, COUNT(*), SUM(copies), ROUND(AVG(rating), 2)
        FROM books GROUP BY author ORDER BY AVG(rating) DESC""")
    تا اس کیو لایت.بعدی(نویسندگان):
        سرچاپ اس کیو لایت.متن(نویسندگان، ۰)، "| کتاب"، اس کیو لایت.عدد صحیح(نویسندگان، ۱)، "| نسخه"، اس کیو لایت.عدد صحیح(نویسندگان، ۲)، "| امتیاز"، اس کیو لایت.عدد اعشار(نویسندگان، ۳)
    پایان
    اس کیو لایت.پایان(نویسندگان)

    سرچاپ اس کیو لایت.پرسمان متن(پایگاه، "SELECT json_group_array(json_object('id', id, 'title', title)) FROM (SELECT id, title FROM books WHERE copies > 0 ORDER BY id LIMIT 2)")
پایان
خروجیدر امانت: مینا کتاب بوف کور را تا 2026-10-31 دارد مینا کتاب کلیدر را تا 2026-11-03 دارد دیرکرد در 2026-11-01: 1 محمود دولت‌آبادی | کتاب 1 | نسخه 2 | امتیاز 4.6 صادق هدایت | کتاب 1 | نسخه 1 | امتیاز 4.5 سیمین دانشور | کتاب 2 | نسخه 2 | امتیاز 4.3 آنتوان دو سنت‌اگزوپری | کتاب 1 | نسخه 1 | امتیاز 3.9 [{"id":1,"title":"بوف کور"},{"id":2,"title":"سووشون"}]

تاریخ‌هایی که به شکل متن YYYY-MM-DD ذخیره شده‌اند، به شکل رشته‌ی ساده هم درست مرتب و مقایسه می‌شوند؛ برای همین due < ? امانت‌های دیرکرده را پیدا می‌کند.

۱۱. رابط مشترک و مهاجرت‌ها

اتصال پایگاه داده را به شکل پویا دیتابیس.اتصال برمی‌گرداند، همان رابطی که بسته‌های MySQL و PostgreSQL هم پیاده می‌کنند. کدی که بر پایه‌ی آن نوشته شود، مثل تابع‌های کمکی و مهاجرت‌گر دیتابیس، با همه‌ی آن‌ها کار می‌کند. مهاجرت‌گر تغییرهای شماره‌دار طرح را به ترتیب نگه می‌دارد، اجراشده‌ها را در جدول schema_migrations ثبت می‌کند و هر کدام را در تراکنش جداگانه اجرا می‌کند. دیتابیس.در تراکنش فهرستی از دستورها را در یک تراکنش اجرا می‌کند و با نخستین شکست همه را برمی‌گرداند.

db-sqlite-migrate.salam
واردسازی دیتابیس
واردسازی دیتابیس.اس کیو لایت

تابع نمایش نسخه‌ها(اتصال: پویا دیتابیس.اتصال):
    ردیف‌ها := اتصال.پرسمان("SELECT title, copies, shelf FROM books ORDER BY id LIMIT 3")
    تا ردیف‌ها.بعدی():
        سرچاپ ردیف‌ها.متن(۰)، ردیف‌ها.عدد صحیح(۱)، ردیف‌ها.متن(۲)
    پایان
    ردیف‌ها.بستن()
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)
    اتصال := اس کیو لایت.اتصال(پایگاه)
    سرچاپ "موتور:"، اتصال.نوع()

    ناپایا مهاجرت‌ها := دیتابیس.مهاجرت گر جدید()
    دیرکن دیتابیس.آزادکردن مهاجرت گر(مهاجرت‌ها)
    دیتابیس.افزودن مهاجرت(مهاجرت‌ها، ۱، "قفسه‌ها"، "ALTER TABLE books ADD COLUMN shelf TEXT NOT NULL DEFAULT 'الف'"، "ALTER TABLE books DROP COLUMN shelf")
    دیتابیس.افزودن مهاجرت(مهاجرت‌ها، ۲، "قفسه‌ی رمان بلند"، "UPDATE books SET shelf = 'ب' WHERE id IN (1, 4, 5)"، "UPDATE books SET shelf = 'الف'")

    سرچاپ "در انتظار:"، دیتابیس.تعداد در انتظار(مهاجرت‌ها، اتصال)
    سرچاپ "اجرا شد:"، دیتابیس.مهاجرت به بالا(مهاجرت‌ها، اتصال)
    سرچاپ "نسخه‌ی طرح:"، دیتابیس.نسخه طرح‌واره(مهاجرت‌ها، اتصال)، "در انتظار:"، دیتابیس.تعداد در انتظار(مهاجرت‌ها، اتصال)

    ناپایا اصلاح := وکتور {} برگردان وکتور<رشته>
    دیرکن اصلاح.آزادکن()
    اصلاح.بیفزا("UPDATE books SET copies = copies + 1 WHERE id = 5")
    اصلاح.بیفزا("UPDATE books SET copies = -1 WHERE id = 4")
    سرچاپ "یا هر دو یا هیچ:"، دیتابیس.در تراکنش(اتصال، اصلاح)
    سرچاپ "نسخه‌های شازده کوچولو:"، دیتابیس.پرسمان عدد(اتصال، "SELECT copies FROM books WHERE id = 5")
    نمایش نسخه‌ها(اتصال)
پایان
خروجیموتور: sqlite در انتظار: 2 اجرا شد: 2 نسخه‌ی طرح: 2 در انتظار: 0 یا هر دو یا هیچ: false نسخه‌های شازده کوچولو: 1 بوف کور 1 ب سووشون 1 الف جزیره سرگردانی 1 الف

دستور دوم اصلاح قید CHECK را می‌شکند، پس دستور اول هم برگردانده می‌شود و شازده کوچولو همان یک نسخه را نگه می‌دارد. اگر این گام را دوباره اجرا کنید مهاجرت‌گر کاری نمی‌کند، چون هر دو نسخه ثبت شده‌اند.

۱۲. جستجوی متن کامل و پشتیبان‌گیری

دو امکانی که SQLite را از یک انبار ساده‌ی جدول فراتر می‌برند. جدول مجازی FTS5 واژه‌ها را برای جستجوی سریع نمایه می‌کند: با پیشوند (بوف*)، صافی ستون (author:هدایت)، OR، رتبه‌بندی و برجسته‌سازی؛ متن جستجو هم فقط یک پارامتر دیگر است. VACUUM INTO رونوشتی تمیز و یکپارچه از پایگاه داده‌ی باز را در پرونده‌ای تازه می‌نویسد و اجرای آن هنگامی که برنامه با پایگاه داده کار می‌کند بی‌خطر است.

db-sqlite-fts.salam
واردسازی دیتابیس.اس کیو لایت
واردسازی سیستم عامل

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن("library.db")
    دیرکن اس کیو لایت.بستن(پایگاه)

    اس کیو لایت.اجرا(پایگاه، """
    DROP TABLE IF EXISTS book_search;
    CREATE VIRTUAL TABLE book_search USING fts5(title, author, note);
    INSERT INTO book_search (rowid, title, author, note)
        SELECT id, title, author, COALESCE(note, '') FROM books;
    """)

    دستور := اس کیو لایت.آماده سازی(پایگاه، "SELECT rowid, highlight(book_search, 0, '[', ']') FROM book_search WHERE book_search MATCH ? ORDER BY rank")
    دیرکن اس کیو لایت.پایان(دستور)
    هر پرسش در ["دانشور"، "بوف*"، "امضا*"، "author:هدایت OR شازده"]:
        اس کیو لایت.بازنشانی(دستور)
        اس کیو لایت.اتصال متن(دستور، ۱، پرسش)
        ناپایا سطر := پرسش + ":"
        تا اس کیو لایت.بعدی(دستور):
            سطر = سطر + " " + اس کیو لایت.متن(دستور، ۰) + "=" + اس کیو لایت.متن(دستور، ۱)
        پایان
        سرچاپ سطر
    پایان

    سیستم عامل.حذف("backup.db")
    اگر اس کیو لایت.اجرا(پایگاه، "VACUUM INTO 'backup.db'") نابرابر ۰:
        سرچاپ "پشتیبان گرفته نشد:"، اس کیو لایت.خطا(پایگاه)
        برگشت ۱
    پایان
    پشتیبان := اس کیو لایت.بازکردن("backup.db")
    دیرکن اس کیو لایت.بستن(پشتیبان)
    سرچاپ "پشتیبان"، اس کیو لایت.پرسمان عدد(پشتیبان، "SELECT COUNT(*) FROM books")، "کتاب و"، اس کیو لایت.پرسمان عدد(پشتیبان، "SELECT COUNT(*) FROM loans")، "امانت دارد"
پایان
خروجیدانشور: 2=سووشون 3=جزیره سرگردانی بوف*: 1=[بوف] کور امضا*: 1=بوف کور author:هدایت OR شازده: 5=[شازده] کوچولو 1=بوف کور پشتیبان 5 کتاب و 3 امانت دارد

جدول جستجو این‌جا یک بار از books پر می‌شود. در برنامه‌ی واقعی آن را با تریگرهای روی books همگام نگه دارید یا پس از تغییرها دوباره بسازید. FTS5 بخشی از کتابخانه‌ی sqlite3 است که بیشتر سیستم‌ها همراه دارند. توکن‌ساز پیش‌فرض آن واژه‌های فارسی را هم درست جدا می‌کند، اما ریشه‌یابی نمی‌کند؛ برای همین امضا* با ستاره نوشته شده تا امضای را هم پیدا کند.

بیشتر

  • پرسمان عدد و پرسمان متن نخستین ستون نخستین ردیف را در یک فراخوانی برمی‌گردانند، برای شمارش‌ها و مقدارهای تکی. وقتی ردیفی نباشد ۰ یا "" برمی‌گردانند و پارامتر نمی‌گیرند، پس فقط با SQL که خودتان نوشته‌اید به کارشان ببرید.
  • هر مقدار پایگاه داده یک اتصال است. آن را میان نخ‌هایی که هم‌زمان می‌نویسند شریک نکنید؛ به هر نخ بازکردن جداگانه‌ای از همان پرونده بدهید، همان‌طور که راهنمای پایین نشان می‌دهد. دیتابیس یک استخر کوچک هم دارد که هر مقدار اتصال را نگه می‌دارد.
  • INSERT ... RETURNING و ON CONFLICT ... DO UPDATE (درج یا به‌روزرسانی) با آماده سازی کار می‌کنند: یک گام بروید و ستون‌های برگشتی را بخوانید.
  • تعداد ستون، نام ستون و نوع ستون نتیجه‌ای را توصیف می‌کنند که خودتان ننوشته‌اید، برای یک نمایشگر جدول یا خروجی گرفتن.
  • داده‌ی دودویی (BLOB) در این بسته تابع اتصال ندارد؛ آن را به شکل متن hex یا base64 ذخیره کنید.

راهنما: شمارنده با درج یا به‌روزرسانی

شمارنده‌ی بازدید، محدودکننده‌ی نرخ یا شمار موجودی به این نیاز دارد: «یکی اضافه کن، یا ردیف را با یک بساز». ON CONFLICT (key) DO UPDATE این کار را در یک دستور و بدون رقابت میان خواندن و نوشتن انجام می‌دهد و RETURNING مقدار تازه را برمی‌گرداند که مثل یک پرسمان با بعدی و عدد صحیح خوانده می‌شود.

db-sqlite-upsert.salam
واردسازی دیتابیس.اس کیو لایت

تابع بازدید(پایگاه: اس کیو لایت.پایگاه داده، صفحه‌ی وب: رشته): صحیح:
    دستور := اس کیو لایت.آماده سازی(پایگاه، "INSERT INTO views (page, n) VALUES (?, 1) ON CONFLICT (page) DO UPDATE SET n = n + 1 RETURNING n")
    دیرکن اس کیو لایت.پایان(دستور)
    اس کیو لایت.اتصال متن(دستور، ۱، صفحه‌ی وب)
    اگر وارونه اس کیو لایت.بعدی(دستور):
        برگشت ۰
    پایان
    برگشت اس کیو لایت.عدد صحیح(دستور، ۰)
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن(":memory:")
    دیرکن اس کیو لایت.بستن(پایگاه)
    اس کیو لایت.اجرا(پایگاه، "CREATE TABLE views (page TEXT PRIMARY KEY, n INTEGER NOT NULL)")

    هر ص در ["/"، "/docs"، "/"، "/std/db-sqlite"، "/"، "/docs"]:
        سرچاپ ص، "بازدید"، بازدید(پایگاه، ص)
    پایان

    ردیف‌ها := اس کیو لایت.پرسمان(پایگاه، "SELECT page, n FROM views ORDER BY n DESC, page")
    تا اس کیو لایت.بعدی(ردیف‌ها):
        سرچاپ اس کیو لایت.عدد صحیح(ردیف‌ها، ۱)، اس کیو لایت.متن(ردیف‌ها، ۰)
    پایان
    اس کیو لایت.پایان(ردیف‌ها)
پایان
خروجی/ بازدید 1 /docs بازدید 1 / بازدید 2 /std/db-sqlite بازدید 1 / بازدید 3 /docs بازدید 2 3 / 2 /docs 1 /std/db-sqlite

راهنما: چاپ هر پرسمان به شکل جدول

وقتی ستون‌ها از پیش معلوم نیستند، مثل صفحه‌ی مدیریت، خروجی گرفتن یا ابزار اشکال‌یابی، از خود نتیجه بپرسید. تعداد ستون و نام ستون سرستون را می‌دهند و متد نوع ستون برای هر مقدار ردیف جاری یکی از ثابت‌های مشترک دیتابیس را برمی‌گرداند (نوع خالی، نوع صحیح، نوع اعشاری، نوع متن، نوع دودویی). یک ستون می‌تواند در هر ردیف نوع دیگری داشته باشد، پس برای هر ردیف بپرسید، نه یک بار.

db-sqlite-dump.salam
واردسازی دیتابیس
واردسازی دیتابیس.اس کیو لایت

تابع خانه(ردیف‌ها: اس کیو لایت.ردیف ها، ستون: صحیح): رشته:
    ترابرد ردیف‌ها.نوع ستون(ستون):
        دیتابیس.نوع خالی: برگشت "NULL" پایان
        دیتابیس.نوع متن: برگشت "'" + ردیف‌ها.متن(ستون) + "'" پایان
    پایان
    برگشت ردیف‌ها.متن(ستون)
پایان

تابع نمایش(پایگاه: اس کیو لایت.پایگاه داده، پرسش: رشته):
    ردیف‌ها := اس کیو لایت.پرسمان(پایگاه، پرسش)
    دیرکن اس کیو لایت.پایان(ردیف‌ها)
    شمار := ردیف‌ها.تعداد ستون()
    ناپایا سرستون := ""
    تکرار شمار در ستون:
        اگر ستون بزرگتر ۰: سرستون = سرستون + " | " پایان
        سرستون = سرستون + ردیف‌ها.نام ستون(ستون)
    پایان
    سرچاپ سرستون
    تا ردیف‌ها.بعدی():
        ناپایا سطر := ""
        تکرار شمار در ستون:
            اگر ستون بزرگتر ۰: سطر = سطر + " | " پایان
            سطر = سطر + خانه(ردیف‌ها، ستون)
        پایان
        سرچاپ سطر
    پایان
پایان

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن(":memory:")
    دیرکن اس کیو لایت.بستن(پایگاه)
    اس کیو لایت.اجرا(پایگاه، "CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT, price REAL, tag TEXT)")
    اس کیو لایت.اجرا(پایگاه، "INSERT INTO items (name, price, tag) VALUES ('خودکار', 1.5, 'اداری'), ('چراغ', 24, NULL), ('لیوان', NULL, 'آشپزخانه')")

    نمایش(پایگاه، "SELECT * FROM items")
    سرچاپ ""
    نمایش(پایگاه، "SELECT tag, COUNT(*) AS items, SUM(price) AS total FROM items GROUP BY tag ORDER BY tag")
پایان
خروجیid | name | price | tag 1 | 'خودکار' | 1.5 | 'اداری' 2 | 'چراغ' | 24.0 | NULL 3 | 'لیوان' | NULL | 'آشپزخانه' tag | items | total NULL | 1 | 24.0 'آشپزخانه' | 1 | NULL 'اداری' | 1 | 1.5

تابع بسته‌ای اس کیو لایت.نوع ستون به‌جای آن کدهای خود SQLite را برمی‌گرداند که در آن ۵ یعنی NULL؛ متدی که این‌جا آمده آن را به دیتابیس.نوع خالی یعنی ۰ تبدیل می‌کند.

راهنما: چند اتصال به یک پرونده

دو برنامه، یا دو نخ با اتصال‌های جدا، می‌توانند یک پرونده را باز کنند. در حالت WAL خواننده‌ها آخرین وضعیت ثبت‌شده را می‌بینند و هیچ‌وقت پشت یک نویسنده نمی‌مانند، ولی در هر لحظه فقط یک نویسنده قفل نوشتن را دارد. نویسنده‌ی دوم فورا پیام database is locked می‌گیرد، یا اگر busy_timeout تنظیم شده باشد پس از آن چند میلی‌ثانیه انتظار.

db-sqlite-wal.salam
واردسازی دیتابیس.اس کیو لایت
واردسازی سیستم عامل

تابع ریشه:
    مسیر := "shop.db"
    نویسنده := اس کیو لایت.بازکردن(مسیر)
    اس کیو لایت.پرسمان متن(نویسنده، "PRAGMA journal_mode = WAL")
    اس کیو لایت.اجرا(نویسنده، "CREATE TABLE stock (item TEXT PRIMARY KEY, qty INTEGER)")
    اس کیو لایت.اجرا(نویسنده، "INSERT INTO stock VALUES ('خودکار', 10)")

    خواننده := اس کیو لایت.بازکردن(مسیر)
    اس کیو لایت.اجرا(خواننده، "PRAGMA busy_timeout = 2000")

    اس کیو لایت.شروع تراکنش(نویسنده)
    اس کیو لایت.اجرا(نویسنده، "UPDATE stock SET qty = 7 WHERE item = 'خودکار'")
    سرچاپ "خواننده در میان نوشتن:"، اس کیو لایت.پرسمان عدد(خواننده، "SELECT qty FROM stock")
    سرچاپ "نویسنده تغییر خودش را می‌بیند:"، اس کیو لایت.پرسمان عدد(نویسنده، "SELECT qty FROM stock")

    دومی := اس کیو لایت.بازکردن(مسیر)
    اس کیو لایت.شروع تراکنش(دومی)
    سرچاپ "نویسنده‌ی دوم:"، اس کیو لایت.اجرا(دومی، "UPDATE stock SET qty = 0")، اس کیو لایت.خطا(دومی)
    اس کیو لایت.بازگردانی(دومی)
    اس کیو لایت.بستن(دومی)

    اس کیو لایت.ثبت تراکنش(نویسنده)
    سرچاپ "خواننده پس از ثبت:"، اس کیو لایت.پرسمان عدد(خواننده، "SELECT qty FROM stock")

    اس کیو لایت.بستن(خواننده)
    اس کیو لایت.بستن(نویسنده)
    سیستم عامل.حذف(مسیر)
پایان
خروجیخواننده در میان نوشتن: 10 نویسنده تغییر خودش را می‌بیند: 7 نویسنده‌ی دوم: -1 database is locked خواننده پس از ثبت: 7

تراکنش‌های نوشتن را کوتاه نگه دارید، روی هر اتصال busy_timeout بگذارید و نوشتنی را که باز هم با database is locked شکست خورد دوباره امتحان کنید. برای سرور وبی پرکار با نویسنده‌های هم‌زمان زیاد، پایگاه داده‌ی سروری مثل PostgreSQL انتخاب بهتری است.

راهنما: ستون‌های JSON

SQLite متن JSON را نگه می‌دارد و تابع‌هایی برای بررسی و خواندن آن در خود SQL دارد، پس داده‌ی بی‌شکل ثابت، مثل گزارش رویدادها یا تنظیمات، می‌تواند کنار ستون‌های معمولی بنشیند. CHECK (json_valid(body)) هنگام درج JSON خراب را رد می‌کند، ->> یک فیلد را می‌خواند و json_group_object از ردیف‌ها یک شیء می‌سازد. درج ردشده این را هم نشان می‌دهد که بازنشانی وقتی آخرین اجرای دستور شکست خورده باشد ۱- برمی‌گرداند.

db-sqlite-json.salam
واردسازی دیتابیس.اس کیو لایت

تابع ریشه:
    پایگاه := اس کیو لایت.بازکردن(":memory:")
    دیرکن اس کیو لایت.بستن(پایگاه)
    اس کیو لایت.اجرا(پایگاه، "CREATE TABLE events (id INTEGER PRIMARY KEY, kind TEXT, body TEXT CHECK (json_valid(body)))")

    دستور := اس کیو لایت.آماده سازی(پایگاه، "INSERT INTO events (kind, body) VALUES (?, ?)")
    دیرکن اس کیو لایت.پایان(دستور)
    گونه‌ها := ["ثبت نام"، "سفارش"، "سفارش"، "خراب"]
    بدنه‌ها := ["{\"user\":\"سارا\",\"plan\":\"free\"}"، "{\"user\":\"سارا\",\"items\":[\"خودکار\",\"لیوان\"],\"total\":12.5}"، "{\"user\":\"رضا\",\"items\":[\"چراغ\"],\"total\":24}"، "{not json"]
    تکرار ۴ در ش:
        اس کیو لایت.بازنشانی(دستور)
        اس کیو لایت.اتصال متن(دستور، ۱، گونه‌ها[ش])
        اس کیو لایت.اتصال متن(دستور، ۲، بدنه‌ها[ش])
        اس کیو لایت.بعدی(دستور)
        اگر اس کیو لایت.بازنشانی(دستور) نابرابر ۰:
            سرچاپ "رد شد"، گونه‌ها[ش] + ":"، اس کیو لایت.خطا(پایگاه)
        پایان
    پایان

    ردیف‌ها := اس کیو لایت.پرسمان(پایگاه، "SELECT body ->> '$.user', json_array_length(body, '$.items'), body ->> '$.total' FROM events WHERE kind = 'سفارش' ORDER BY id")
    تا اس کیو لایت.بعدی(ردیف‌ها):
        سرچاپ اس کیو لایت.متن(ردیف‌ها، ۰)، "| قلم"، اس کیو لایت.عدد صحیح(ردیف‌ها، ۱)، "| جمع"، اس کیو لایت.عدد اعشار(ردیف‌ها، ۲)
    پایان
    اس کیو لایت.پایان(ردیف‌ها)

    سرچاپ اس کیو لایت.پرسمان متن(پایگاه، "SELECT json_group_object(u, n) FROM (SELECT body ->> '$.user' AS u, COUNT(*) AS n FROM events GROUP BY u ORDER BY u)")
پایان
خروجیرد شد خراب: CHECK constraint failed: json_valid(body) سارا | قلم 2 | جمع 12.5 رضا | قلم 1 | جمع 24 {"رضا":1,"سارا":2}

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

کارابزار
ساخت جدول، اجرای یک اسکریپت ثابتاجرا (یک یا چند دستور)
هر SQL با مقداری از بیرونآماده سازی، اتصال ...، بعدی، پایان
یک دستور برای ردیف‌های بسیاریک بار آماده سازی، سپس برای هر ردیف بازنشانی و اتصال دوباره، درون شروع تراکنش و ثبت تراکنش
خواندن نتیجهتا بعدی(ردیف‌ها): با متن، عدد صحیح، عدد صحیح۶۴، عدد اعشار، خالی است
یک عدد یا یک رشته با SQL ثابتپرسمان عدد، پرسمان متن
شناسه‌ی ردیف تازه، شمار ردیف‌های تغییرکردهشناسه آخرین درج، تعداد تغییرات، مجموع تغییرات
همه یا هیچشروع تراکنش، ثبت تراکنش، بازگردانی، یا دیتابیس.در تراکنش از راه اتصال
کدی که روی MySQL یا PostgreSQL هم اجرا شوداتصال و تابع‌های کمکی دیتابیس
فهمیدن این‌که چه چیزی خراب شددستور معتبر، مقدار برگشتی پایان یا بازنشانی، سپس خطا

گونه‌ها

پایگاه داده Database

ساختار پایگاه داده
یک پایگاه داده‌ی SQLite باز.
نامانگلیسیگونهتوضیح
دستهhandleتهی*اشاره‌گر SQLite.
db-sqlite-Methods.salam
واردسازی دیتابیس
واردسازی دیتابیس.اس کیو لایت

تابع ریشه:
    پ := اس کیو لایت.بازکردن(":memory:")
    سرچاپ پ.نوع()، پ.معتبر()، پ.پینگ()
    _ := پ.اجرا("CREATE TABLE notes (id INTEGER PRIMARY KEY, body TEXT, stars REAL)")
    _ := پ.اجرا("INSERT INTO notes (body, stars) VALUES (" + پ.نقل قول("یادداشتِ 'اول'") + ", 4.5)")
    سرچاپ پ.شناسه آخرین درج()، پ.تعداد تغییرات()

    ت := پ.شروع تراکنش()
    _ := ت.اجرا("INSERT INTO notes (body) VALUES ('دوم')")
    تر := ت.پرسمان("SELECT COUNT(*) FROM notes")
    _ := تر.بعدی()
    سرچاپ تر.عدد صحیح(۰)
    _ := تر.بستن()
    سرچاپ ت.معتبر()، ت.ثبت تراکنش()

    ر := پ.پرسمان("SELECT id, body, stars FROM notes ORDER BY id")
    سرچاپ ر.معتبر()، ر.تعداد ستون()، ر.نام ستون(۲)
    تا ر.بعدی():
        ناپایا ستاره := "-"
        اگر وارونه ر.خالی است(۲):
            ستاره = "" + ر.عدد اعشار(۲)
        پایان
        سرچاپ ر.عدد صحیح۶۴(۰)، ر.متن(۱)، ستاره، ر.نوع ستون(۲)
    پایان
    _ := ر.بستن()

    ت۲ := پ.شروع تراکنش()
    _ := ت۲.اجرا("DELETE FROM notes")
    _ := ت۲.بازگردانی()
    ا := اس کیو لایت.اتصال(پ)
    سرچاپ دیتابیس.پرسمان عدد(ا، "SELECT COUNT(*) FROM notes")
    سرچاپ پ.اجرا("DROP TABLE nope") != ۰، پ.خطا()
    سرچاپ پ.بستن()
پایان
خروجیsqlite true true 1 1 2 true 0 true 3 stars 1 یادداشتِ 'اول' 4.5 2 2 دوم - 0 2 true no such table: nope 0

نوع Kind

تابع نوع(): رشته
نام موتور پایگاه داده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

معتبر Ok

تابع معتبر(): منطقی
دستگیره‌ای هست. SQLite حتی وقتی پرونده باز نمی‌شود هم دستگیره برمی‌گرداند، پس پیش از اعتماد یک دستور اجرا کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

پینگ Ping

تابع پینگ(): منطقی
تا وقتی دستگیره باز است درست است؛ SQLite سروری ندارد، پس این به پرونده دست نمی‌زند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

اجرا Exec

تابع اجرا(sql: رشته): صحیح
یک یا چند دستور جداشده با نقطه‌ویرگول را اجرا می‌کند؛ صفر یعنی موفق.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

پرسمان Query

تابع پرسمان(sql: رشته): dyn db.ردیف ها
پرسمانی را آماده می‌کند و ردیف‌های آن را برمی‌گرداند؛ اگر SQL خطا داشته باشد معتبر نادرست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

شروع تراکنش Begin

تابع شروع تراکنش(): dyn db.Tx
تراکنشی آغاز می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

شناسه آخرین درج LastInsertId

تابع شناسه آخرین درج(): صحیح۶۴
شناسه‌ی آخرین ردیف درج‌شده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

تعداد تغییرات Changes

تابع تعداد تغییرات(): صحیح۶۴
شمار ردیف‌هایی که آخرین دستور تغییر داد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

خطا Error

تابع خطا(): رشته
آخرین پیام خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

نقل قول Quote

تابع نقل قول(s: رشته): رشته
رشته را با نقل‌قول و گریز امن برای SQL برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

بستن Close

تابع بستن(): صحیح
می‌بندد؛ صفر یعنی موفق.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

ردیف ها Rows

ساختار ردیف ها
یک دستور آماده یا نتیجه‌ی پرسمان.
نامانگلیسیگونهتوضیح
دستهhandleتهی*اشاره‌گر دستور.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

معتبر Ok

تابع معتبر(): منطقی
سالم است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

بعدی Next

تابع بعدی(): منطقی
به ردیف بعدی می‌رود؛ اگر ردیفی نماند، نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

تعداد ستون ColumnCount

تابع تعداد ستون(): صحیح
شمار ستون‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

نام ستون ColumnName

تابع نام ستون(col: صحیح): رشته
نام ستون.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

نوع ستون ColumnType

تابع نوع ستون(col: صحیح): صحیح
گونه‌ی مقدار ستون در ردیف جاری، یکی از ثابت‌های نوع ... در دیتابیس؛ برای تهی صفر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

خالی است IsNull

تابع خالی است(col: صحیح): منطقی
مقدار ستون تهی است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

متن Text

تابع متن(col: صحیح): رشته
مقدار ستون به شکل متن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

عدد صحیح Int

تابع عدد صحیح(col: صحیح): صحیح
مقدار ستون به شکل عدد صحیح.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

عدد صحیح۶۴ Int64

تابع عدد صحیح۶۴(col: صحیح): صحیح۶۴
مقدار ستون به شکل عدد ۶۴ بیتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

عدد اعشار Float

تابع عدد اعشار(col: صحیح): اعشار۶۴
مقدار ستون به شکل اعشاری.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

بستن Close

تابع بستن(): صحیح
می‌بندد و آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam

تراکنش Txn

ساختار تراکنش
یک تراکنش.
نامانگلیسیگونهتوضیح
دستهhandleتهی*اشاره‌گر پایگاه داده.
db-sqlite-Basics.salam
واردسازی دیتابیس.اس کیو لایت

تابع ریشه:
    سرچاپ اس کیو لایت.در دسترس()، اس کیو لایت.نسخه().طول() > ۰
    پ := اس کیو لایت.بازکردن(":memory:")
    سرچاپ اس کیو لایت.معتبر(پ)
    _ := اس کیو لایت.اجرا(پ، "CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT NOT NULL, pages INTEGER, price REAL, note TEXT)")
    _ := اس کیو لایت.اجرا(پ، "INSERT INTO books (title, pages, price) VALUES ('شازده کوچولو', 96, 4.5)")
    سرچاپ اس کیو لایت.شناسه آخرین درج(پ)، اس کیو لایت.تعداد تغییرات(پ)

    د := اس کیو لایت.آماده سازی(پ، "INSERT INTO books (title, pages, price, note) VALUES (?, ?, ?, ?)")
    سرچاپ اس کیو لایت.دستور معتبر(د)
    _ := اس کیو لایت.اتصال متن(د، ۱، "بوف کور")
    _ := اس کیو لایت.اتصال عدد(د، ۲، ۱۲۰)
    _ := اس کیو لایت.اتصال اعشار(د، ۳، ۶.۲۵)
    _ := اس کیو لایت.اتصال خالی(د، ۴)
    _ := اس کیو لایت.بعدی(د)
    _ := اس کیو لایت.بازنشانی(د)
    _ := اس کیو لایت.اتصال متن(د، ۱، "سووشون")
    _ := اس کیو لایت.اتصال عدد(د، ۲، ۳۰۴)
    _ := اس کیو لایت.اتصال اعشار(د، ۳، ۹)
    _ := اس کیو لایت.اتصال متن(د، ۴، "کلاسیک")
    _ := اس کیو لایت.بعدی(د)
    _ := اس کیو لایت.پایان(د)
    سرچاپ اس کیو لایت.مجموع تغییرات(پ)

    ر := اس کیو لایت.پرسمان(پ، "SELECT id, title, pages, price, note FROM books ORDER BY id")
    سرچاپ اس کیو لایت.تعداد ستون(ر)، اس کیو لایت.نام ستون(ر، ۱)
    تا اس کیو لایت.بعدی(ر):
        ناپایا یادداشت := "-"
        اگر وارونه اس کیو لایت.خالی است(ر، ۴):
            یادداشت = اس کیو لایت.متن(ر، ۴)
        پایان
        سرچاپ اس کیو لایت.عدد صحیح(ر، ۰)، اس کیو لایت.متن(ر، ۱)، اس کیو لایت.عدد صحیح۶۴(ر، ۲)، اس کیو لایت.عدد اعشار(ر، ۳)، یادداشت
    پایان
    _ := اس کیو لایت.پایان(ر)

    ن := اس کیو لایت.پرسمان(پ، "SELECT pages, title, price, note FROM books WHERE id = 2")
    _ := اس کیو لایت.بعدی(ن)
    سرچاپ اس کیو لایت.نوع ستون(ن، ۰)، اس کیو لایت.نوع ستون(ن، ۱)، اس کیو لایت.نوع ستون(ن، ۲)، اس کیو لایت.نوع ستون(ن، ۳)
    _ := اس کیو لایت.پایان(ن)

    سرچاپ اس کیو لایت.پرسمان عدد(پ، "SELECT SUM(pages) FROM books")، اس کیو لایت.پرسمان متن(پ، "SELECT title FROM books ORDER BY price DESC LIMIT 1")

    _ := اس کیو لایت.شروع تراکنش(پ)
    _ := اس کیو لایت.اجرا(پ، "DELETE FROM books")
    _ := اس کیو لایت.بازگردانی(پ)
    _ := اس کیو لایت.شروع تراکنش(پ)
    _ := اس کیو لایت.اجرا(پ، "UPDATE books SET price = price * 2")
    _ := اس کیو لایت.ثبت تراکنش(پ)
    سرچاپ اس کیو لایت.پرسمان عدد(پ، "SELECT COUNT(*) FROM books")، اس کیو لایت.پرسمان متن(پ، "SELECT price FROM books WHERE id = 1")

    سرچاپ اس کیو لایت.اجرا(پ، "SELECT * FROM missing") != ۰
    سرچاپ اس کیو لایت.خطا(پ)
    _ := اس کیو لایت.بستن(پ)
پایان
خروجیtrue true true 1 1 true 3 5 title 1 شازده کوچولو 96 4.5 - 2 بوف کور 120 6.25 - 3 سووشون 304 9 کلاسیک 1 3 2 5 520 سووشون 3 9.0 true no such table: missing

معتبر Ok

تابع معتبر(): منطقی
سالم است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

اجرا Exec

تابع اجرا(sql: رشته): صحیح
یک یا چند دستور را درون تراکنش اجرا می‌کند؛ صفر یعنی موفق.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

پرسمان Query

تابع پرسمان(sql: رشته): dyn db.ردیف ها
پرسمانی را اجرا می‌کند و ردیف‌ها را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

ثبت تراکنش Commit

تابع ثبت تراکنش(): صحیح
تراکنش را ثبت می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

بازگردانی Rollback

تابع بازگردانی(): صحیح
تراکنش را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

تابع‌ها

اتصال Conn

تابع اتصال(d: پایگاه داده): dyn db.Connection
پایگاه داده را به شکل اتصال مشترک برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

در دسترس Available

تابع در دسترس(): منطقی
همیشه درست: برنامه به کتابخانه‌ی sqlite3 پیوند خورده و بدون آن اجرا نمی‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

نسخه Version

تابع نسخه(): رشته
نسخه‌ی SQLite.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

بازکردن Open

تابع بازکردن(path: رشته): پایگاه داده
پرونده‌ی پایگاه داده را باز می‌کند و اگر نباشد می‌سازد؛ :memory: یا مسیر خالی یعنی پایگاه داده‌ی موقت در حافظه. حتی وقتی پرونده باز نمی‌شود هم دستگیره برمی‌گردد، پس نخستین دستور را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

معتبر Ok

تابع معتبر(db: پایگاه داده): منطقی
دستگیره‌ای هست. SQLite حتی وقتی پرونده باز نمی‌شود هم دستگیره برمی‌گرداند؛ آن‌گاه نخستین دستور با unable to open database file شکست می‌خورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

بستن Close

تابع بستن(db: پایگاه داده): صحیح
می‌بندد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

اجرا Exec

تابع اجرا(db: پایگاه داده، sql: رشته): صحیح
یک یا چند دستور را اجرا می‌کند؛ صفر یعنی موفق.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

خطا Error

تابع خطا(db: پایگاه داده): رشته
آخرین پیام خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

شناسه آخرین درج LastInsertId

تابع شناسه آخرین درج(db: پایگاه داده): صحیح۶۴
شناسه‌ی آخرین ردیف درج‌شده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

تعداد تغییرات Changes

تابع تعداد تغییرات(db: پایگاه داده): صحیح
شمار ردیف‌هایی که آخرین دستور تغییر داد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

مجموع تغییرات TotalChanges

تابع مجموع تغییرات(db: پایگاه داده): صحیح
شمار همه‌ی ردیف‌های تغییرکرده از زمان باز شدن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

شروع تراکنش Begin

تابع شروع تراکنش(db: پایگاه داده): صحیح
تراکنشی آغاز می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

ثبت تراکنش Commit

تابع ثبت تراکنش(db: پایگاه داده): صحیح
تراکنش را ثبت می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

بازگردانی Rollback

تابع بازگردانی(db: پایگاه داده): صحیح
تراکنش را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

آماده سازی Prepare

تابع آماده سازی(db: پایگاه داده، sql: رشته): ردیف ها
دستوری با جای پارامتر ? آماده می‌کند؛ مقدارها را با تابع‌های اتصال ... بدهید. اگر SQL خطا داشته باشد دستور معتبر نادرست است. امن‌ترین راه برای مقدارهای کاربر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

پرسمان Query

تابع پرسمان(db: پایگاه داده، sql: رشته): ردیف ها
پرسمانی را اجرا می‌کند؛ ردیف‌ها را با بعدی بخوانید و در پایان پایان را صدا بزنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

دستور معتبر StmtOk

تابع دستور معتبر(rows: ردیف ها): منطقی
دستور آماده شد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

بعدی Next

تابع بعدی(rows: ردیف ها): منطقی
دستور را یک گام اجرا می‌کند؛ اگر ردیفی آماده است، درست. هم پس از آخرین ردیف و هم هنگام خطا نادرست است؛ مقدار برگشتی پایان یا بازنشانی این دو را از هم جدا می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

بازنشانی Reset

تابع بازنشانی(rows: ردیف ها): صحیح
دستور را برای اجرای دوباره آماده می‌کند. مقدارهای متصل تا اتصال مقدار تازه می‌مانند؛ اگر اجرای قبلی شکست خورده باشد ۱- و دلیل در خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

پایان Finish

تابع پایان(rows: ردیف ها): صحیح
دستور را آزاد می‌کند؛ اگر آخرین اجرای آن شکست خورده باشد ۱- و دلیل در خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

اتصال متن BindText

تابع اتصال متن(rows: ردیف ها، idx: صحیح، val: رشته): صحیح
متن را به پارامتر شماره‌ی n می‌دهد؛ شماره از ۱.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

اتصال عدد BindInt

تابع اتصال عدد(rows: ردیف ها، idx: صحیح، val: صحیح۶۴): صحیح
عدد صحیح ۶۴ بیتی را به پارامتر می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

اتصال اعشار BindFloat

تابع اتصال اعشار(rows: ردیف ها، idx: صحیح، val: اعشار۶۴): صحیح
اعشاری را به پارامتر می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

اتصال خالی BindNull

تابع اتصال خالی(rows: ردیف ها، idx: صحیح): صحیح
تهی را به پارامتر می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

تعداد ستون ColumnCount

تابع تعداد ستون(rows: ردیف ها): صحیح
شمار ستون‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

متن Text

تابع متن(rows: ردیف ها، col: صحیح): رشته
مقدار ستون به شکل متن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

نام ستون ColumnName

تابع نام ستون(rows: ردیف ها، col: صحیح): رشته
نام ستون.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

عدد صحیح Int

تابع عدد صحیح(rows: ردیف ها، col: صحیح): صحیح
مقدار ستون به شکل عدد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

عدد صحیح۶۴ Int64

تابع عدد صحیح۶۴(rows: ردیف ها، col: صحیح): صحیح۶۴
مقدار ستون ۶۴ بیتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

عدد اعشار Float

تابع عدد اعشار(rows: ردیف ها، col: صحیح): اعشار۶۴
مقدار ستون اعشاری.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

نوع ستون ColumnType

تابع نوع ستون(rows: ردیف ها، col: صحیح): صحیح
کد گونه‌ی خود SQLite برای ستون: ۱ صحیح، ۲ اعشاری، ۳ متن، ۴ دودویی و ۵ تهی. متد نوع ستون ردیف‌ها به‌جای آن ثابت‌های مشترک را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

خالی است IsNull

تابع خالی است(rows: ردیف ها، col: صحیح): منطقی
مقدار ستون تهی است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

پرسمان عدد QueryInt

تابع پرسمان عدد(db: پایگاه داده، sql: رشته): صحیح
نخستین ستون نخستین ردیف به شکل عدد؛ اگر ردیفی نباشد یا SQL شکست بخورد ۰.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam

پرسمان متن QueryText

تابع پرسمان متن(db: پایگاه داده، sql: رشته): رشته
نخستین ستون نخستین ردیف به شکل متن؛ اگر ردیفی نباشد یا SQL شکست بخورد رشته‌ی خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam