اس کیو لایت db/sqlite
پایگاه دادهی SQLite در یک پرونده یا در حافظه.
واردسازی دیتابیس.اس کیو لایت
- آموزش: کتابخانهی امانی در دوازده گام
- ۱. باز کردن پایگاه داده و تنظیم گزینهها
- ۲. ساخت جدولها
- ۳. درج ردیفها
- ۴. خواندن ردیفها در ساختارهای خودتان
- ۵. پارامترها و تزریق SQL
- ۶. مقدارهای NULL
- ۷. تراکنشها
- ۸. ویرایش و حذف
- ۹. خطاها
- ۱۰. گزارش با پیوند و گروهبندی
- ۱۱. رابط مشترک و مهاجرتها
- ۱۲. جستجوی متن کامل و پشتیبانگیری
- بیشتر
- راهنما: شمارنده با درج یا بهروزرسانی
- راهنما: چاپ هر پرسمان به شکل جدول
- راهنما: چند اتصال به یک پرونده
- راهنما: ستونهای JSON
- راهنما: کدام تابع برای کدام کار
- گونهها
- تابعها
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 اتصال را وادار میکند به اندازهی این چند میلیثانیه برای قفل صبر کند و فورا شکست نخورد.
واردسازی دیتابیس.اس کیو لایت
واردسازی رشته
تابع ریشه:
اگر وارونه اس کیو لایت.در دسترس():
سرچاپ "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 حتی وقتی پرونده باز نمیشود هم دستگیره برمیگرداند، پس معتبر درست است و مشکل تازه با شکست نخستین دستور پیدا میشود. برای همین این گام پیش از اعتماد به پایگاه داده SELECT 1 را اجرا میکند.
۲. ساخت جدولها
اجرا یک یا چند دستور جداشده با نقطهویرگول را اجرا میکند و در صورت موفقیت ۰ و در صورت شکست ۱- برمیگرداند و دلیل را در خطا نگه میدارد. رشتهی سهگیومهای یک طرح بلند را خوانا نگه میدارد. IF NOT EXISTS اجرای دوبارهی گام را بیخطر میکند و PRAGMA user_version یک عدد آزاد در سرآیند پرونده است که برای نسخهی طرح به کار میآید (گام ۱۱ بهجای آن از جدول مهاجرت استفاده میکند).
واردسازی دیتابیس.اس کیو لایت
تابع ریشه:
پایگاه := اس کیو لایت.بازکردن("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")
پایاننوعها در SQLite سختگیر نیستند: ستونی که INTEGER تعریف شده، اگر متن بدهید متن نگه میدارد. چیزی که واقعا داده را تمیز نگه میدارد قیدهایی مثل NOT NULL، UNIQUE و CHECK است. ستون INTEGER PRIMARY KEY همان شناسهی ردیف است و هنگام درج خودش پر میشود.
۳. درج ردیفها
آماده سازی دستوری با جاهای ? را یک بار ترجمه میکند؛ تابعهای اتصال ... جاها را پر میکنند (شماره از ۱)، بعدی آن را اجرا میکند و بازنشانی آن را برای ردیف بعدی آماده میکند. یک بار آماده کردن و چند بار پر کردن، هم سریعتر است و هم امنتر از ساختن رشتهی SQL تازه برای هر ردیف. شناسه آخرین درج شناسهای را که SQLite انتخاب کرد میدهد و تعداد تغییرات شمار ردیفهایی را که آخرین دستور تغییر داد.
واردسازی دیتابیس.اس کیو لایت
ساختار کتاب:
همگانی عنوان: رشته = ""
همگانی نویسنده: رشته = ""
همگانی سال: صحیح = ۰
همگانی نسخهها: صحیح = ۱
همگانی امتیاز: اعشار۶۴ = ۰.۰
پایان
تابع ریشه:
پایگاه := اس کیو لایت.بازکردن("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")
پایاناتصال عدد یک صحیح۶۴ میگیرد، پس فیلد صحیح با برگردان صحیح۶۴ تبدیل میشود. دستور با پایان آزاد میشود و دیرکن مطمئن میشود که تابع هر طور تمام شود این کار انجام میشود.
۴. خواندن ردیفها در ساختارهای خودتان
پرسمان هم یک دستور است: بعدی به ردیف بعدی میرود و وقتی ردیفی نماند نادرست برمیگرداند، و متن، عدد صحیح، عدد صحیح۶۴ و عدد اعشار ستونهای ردیف جاری را با شمارهشان میخوانند که از ۰ شروع میشود. خواندن یک ردیف را در تابعی کوچک بگذارید تا هر پرسمانی که همان ستونها را انتخاب میکند از آن استفاده کند.
واردسازی دیتابیس.اس کیو لایت
ساختار کتاب:
همگانی شناسه: صحیح۶۴ = ۰
همگانی عنوان: رشته = ""
همگانی نویسنده: رشته = ""
همگانی سال: صحیح = ۰
همگانی نسخهها: صحیح = ۰
همگانی امتیاز: اعشار۶۴ = ۰.۰
پایان
تابع خواندن کتاب(ردیفها: اس کیو لایت.ردیف ها): کتاب:
برگشت کتاب {
شناسه = اس کیو لایت.عدد صحیح۶۴(ردیفها، ۰)،
عنوان = اس کیو لایت.متن(ردیفها، ۱)،
نویسنده = اس کیو لایت.متن(ردیفها، ۲)،
سال = اس کیو لایت.عدد صحیح(ردیفها، ۳)،
نسخهها = اس کیو لایت.عدد صحیح(ردیفها، ۴)،
امتیاز = اس کیو لایت.عدد اعشار(ردیفها، ۵)
}
پایان
تابع کتابهای نویسنده(پایگاه: اس کیو لایت.پایگاه داده، نام: رشته): وکتور<کتاب>:
ناپایا خروجی := وکتور {} برگردان وکتور<کتاب>
دستور := اس کیو لایت.آماده سازی(پایگاه، "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")
دیرکن اس کیو لایت.بستن(پایگاه)
دانشور := کتابهای نویسنده(پایگاه، "سیمین دانشور")
دیرکن دانشور.آزادکن()
هر ک در دانشور:
سرچاپ ک.شناسه، ک.عنوان، ک.سال، ک.امتیاز
پایان
ناپایا پیدا شد := نادرست
ک := کتاب با شناسه(پایگاه، ۴، پیدا شد)
سرچاپ پیدا شد، ک.عنوان، "از"، ک.نویسنده + "،"، ک.نسخهها، "نسخه"
کتاب با شناسه(پایگاه، ۹۹، پیدا شد)
سرچاپ "کتاب ۹۹ پیدا شد:"، پیدا شد
پایانشناسهها صحیح۶۴ هستند؛ آنها را با عدد صحیح۶۴ بخوانید. عدد صحیح ۳۲ بیتی است و عددهای بزرگ را خراب میکند. وقتی ممکن است جستجو چیزی پیدا نکند، این را جدا گزارش کنید (اینجا با پارامتر پیدا شد)، نه با برگرداندن ساختاری خالی که شبیه یک کتاب واقعی است.
۵. پارامترها و تزریق SQL
مقداری که با پارامتر فرستاده میشود هرگز به شکل SQL خوانده نمیشود، پس نمیتواند کار دستور را عوض کند. متنی که به رشتهی SQL چسبانده شود میتواند. این گام با چیزی که کاربر نوشته جستجو میکند و سپس همان متن را چسبانده نشان میدهد: رشتهی حمله با همهی کتابها جور میشود و یک نام معمولی که گیومهی تکی دارد دستور را میشکند.
واردسازی دیتابیس.اس کیو لایت
تابع جستجو(پایگاه: اس کیو لایت.پایگاه داده، نوشته: رشته):
دستور := اس کیو لایت.آماده سازی(پایگاه، "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 = " + پایگاه.نقل قول(نام))
پایانبرای هر مقداری که از بیرون برنامه میآید پارامتر به کار ببرید. متد نقل قول پایگاه داده (از رابط مشترک دیتابیس) متن را در گیومه میگذارد و گیومههای درون آن را دوتایی میکند؛ آن را برای جای کمیابی نگه دارید که مقدار نمیتواند پارامتر باشد، مثل SQL که برای ابزار دیگری تولید میکنید. نام جدول و ستون اصلا نمیتواند پارامتر باشد، پس آن را از فهرستی ثابت در کد خودتان انتخاب کنید.
۶. مقدارهای NULL
مقدار نبوده در SQL همان NULL است که با رشتهی خالی یا صفر یکی نیست. اتصال خالی آن را ذخیره میکند و خالی است میگوید ستونی آن را دارد. متن برای NULL رشتهی "" و عدد صحیح و عدد اعشار صفر برمیگردانند، پس هر جا خالی و نبوده معنای جدا دارند، اول خالی است را بپرسید یا بگذارید SQL با COALESCE مقدار پیشفرض بگذارد.
واردسازی دیتابیس.اس کیو لایت
تابع اتصال اختیاری(دستور: اس کیو لایت.ردیف ها، جا: صحیح، مقدار: رشته):
اگر مقدار برابر "":
اس کیو لایت.اتصال خالی(دستور، جا)
وگرنه:
اس کیو لایت.اتصال متن(دستور، جا، مقدار)
پایان
پایان
تابع ثبت یادداشت(پایگاه: اس کیو لایت.پایگاه داده، شناسه: صحیح۶۴، یادداشت: رشته):
دستور := اس کیو لایت.آماده سازی(پایگاه، "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")
پایان۷. تراکنشها
امانت دادن یک کتاب دو نوشتن است: یک نسخه کمتر در قفسه و یک ردیف تازه در loans. این دو باید با هم انجام شوند یا هیچکدام. شروع تراکنش تراکنش را آغاز میکند، ثبت تراکنش همهی تغییرهای آن را یکجا ماندگار میکند و بازگردانی همه را دور میریزد. هر تابع کمکی گزارش میدهد که آیا دقیقا یک ردیف تغییر کرد، پس کتابی که نسخهای از آن نمانده یا عضوی ناشناخته کل امانت را برمیگرداند.
واردسازی دیتابیس.اس کیو لایت
تابع گام(پایگاه: اس کیو لایت.پایگاه داده، پرسش: رشته، الف: صحیح۶۴، ب: صحیح۶۴، سررسید: رشته): منطقی:
دستور := اس کیو لایت.آماده سازی(پایگاه، پرسش)
اس کیو لایت.اتصال عدد(دستور، ۱، الف)
اگر ب بزرگتر ۰:
اس کیو لایت.اتصال عدد(دستور، ۲، ب)
اس کیو لایت.اتصال متن(دستور، ۳، سررسید)
پایان
اس کیو لایت.بعدی(دستور)
برگشت اس کیو لایت.پایان(دستور) برابر ۰ و اس کیو لایت.تعداد تغییرات(پایگاه) برابر ۱
پایان
تابع امانت(پایگاه: اس کیو لایت.پایگاه داده، کتاب: صحیح۶۴، عضو: صحیح۶۴، امروز: رشته): منطقی:
اگر اس کیو لایت.شروع تراکنش(پایگاه) نابرابر ۰:
برگشت نادرست
پایان
اگر وارونه گام(پایگاه، "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")
پایانتاریخ سررسید را تابع date() خود SQLite حساب میکند. تراکنش راه سریع کردن درج انبوه هم هست: SQLite برای هر تراکنش یک بار روی دیسک مینویسد، پس هزار درج درون یک شروع تراکنش و ثبت تراکنش کسری از زمان هزار درج جدا را میگیرد.
۸. ویرایش و حذف
UPDATE و DELETE مثل هر SQL دیگری با اجرا یا دستور آماده اجرا میشوند. تعداد تغییرات میگوید آخرین دستور به چند ردیف دست زد؛ برنامه از همین راه میفهمد که یک UPDATE ... WHERE با هیچ ردیفی جور نشد. مجموع تغییرات همهی ردیفهایی را میشمارد که از زمان باز شدن پایگاه داده تغییر کردهاند.
واردسازی دیتابیس.اس کیو لایت
تابع بازپس دادن(پایگاه: اس کیو لایت.پایگاه داده، امانت: صحیح۶۴، روز: رشته): منطقی:
اس کیو لایت.شروع تراکنش(پایگاه)
دستور := اس کیو لایت.آماده سازی(پایگاه، "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)")
سرچاپ "عضوهای بیامانت حذف شدند:"، اس کیو لایت.تعداد تغییرات(پایگاه)
سرچاپ "ردیفهای تغییرکرده در این برنامه:"، اس کیو لایت.مجموع تغییرات(پایگاه) - تغییرات پیشین
پایانبازگرداندن دوبارهی یک امانت به خاطر returned IS NULL در بخش WHERE شکست میخورد: شرط بررسی را انجام میدهد و تعداد تغییرات نتیجه را گزارش میکند.
۹. خطاها
هر تابع شکست را در مقدار برگشتیاش گزارش میکند و دلیل را در خطا نگه میدارد. اشتباه در خود SQL فورا پیدا میشود: آماده سازی دستوری برمیگرداند که دستور معتبر برایش نادرست است. شکستن یک قید هنگام اجرای دستور پیدا میشود: بعدی نادرست برمیگرداند (درست مثل پایان ردیفها) و پایان یا بازنشانی ۱- برمیگرداند. برای جدا کردن این دو حالت، مقدار پایان را بررسی کنید.
واردسازی دیتابیس.اس کیو لایت
تابع درج(پایگاه: اس کیو لایت.پایگاه داده، پرسش: رشته، الف: رشته، ب: صحیح۶۴): منطقی:
دستور := اس کیو لایت.آماده سازی(پایگاه، پرسش)
اگر وارونه اس کیو لایت.دستور معتبر(دستور):
سرچاپ " آماده نشد:"، اس کیو لایت.خطا(پایگاه)
برگشت نادرست
پایان
اس کیو لایت.اتصال متن(دستور، ۱، الف)
اس کیو لایت.اتصال عدد(دستور، ۲، ب)
تمام := وارونه اس کیو لایت.بعدی(دستور)
اگر اس کیو لایت.پایان(دستور) نابرابر ۰:
سرچاپ " شکست خورد:"، اس کیو لایت.خطا(پایگاه)
برگشت نادرست
پایان
برگشت تمام
پایان
تابع ریشه:
پایگاه := اس کیو لایت.بازکردن("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")
پایانخطا را درست پس از فراخوانی شکستخورده بخوانید، چون دستور بعدی پیام را عوض میکند. پیامهای SQLite انگلیسیاند و نام قید را میگویند و همین برای ساختن پیامی برای کاربر کافی است (UNIQUE constraint failed: members.name یعنی این نام پیشتر گرفته شده است).
۱۰. گزارش با پیوند و گروهبندی
بیشتر کار یک گزارش با SQL است. JOIN ردیفهای مرتبط را کنار هم میآورد، GROUP BY با COUNT، SUM و AVG آنها را خلاصه میکند و تابعهای JSON خود SQLite میتوانند پاسخ JSON یک API وب را در یک پرسمان بسازند که با پرسمان متن خوانده میشود.
واردسازی دیتابیس.اس کیو لایت
تابع ریشه:
پایگاه := اس کیو لایت.بازکردن("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)")
پایانتاریخهایی که به شکل متن YYYY-MM-DD ذخیره شدهاند، به شکل رشتهی ساده هم درست مرتب و مقایسه میشوند؛ برای همین due < ? امانتهای دیرکرده را پیدا میکند.
۱۱. رابط مشترک و مهاجرتها
اتصال پایگاه داده را به شکل پویا دیتابیس.اتصال برمیگرداند، همان رابطی که بستههای MySQL و PostgreSQL هم پیاده میکنند. کدی که بر پایهی آن نوشته شود، مثل تابعهای کمکی و مهاجرتگر دیتابیس، با همهی آنها کار میکند. مهاجرتگر تغییرهای شمارهدار طرح را به ترتیب نگه میدارد، اجراشدهها را در جدول schema_migrations ثبت میکند و هر کدام را در تراکنش جداگانه اجرا میکند. دیتابیس.در تراکنش فهرستی از دستورها را در یک تراکنش اجرا میکند و با نخستین شکست همه را برمیگرداند.
واردسازی دیتابیس
واردسازی دیتابیس.اس کیو لایت
تابع نمایش نسخهها(اتصال: پویا دیتابیس.اتصال):
ردیفها := اتصال.پرسمان("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")
نمایش نسخهها(اتصال)
پایاندستور دوم اصلاح قید CHECK را میشکند، پس دستور اول هم برگردانده میشود و شازده کوچولو همان یک نسخه را نگه میدارد. اگر این گام را دوباره اجرا کنید مهاجرتگر کاری نمیکند، چون هر دو نسخه ثبت شدهاند.
۱۲. جستجوی متن کامل و پشتیبانگیری
دو امکانی که SQLite را از یک انبار سادهی جدول فراتر میبرند. جدول مجازی FTS5 واژهها را برای جستجوی سریع نمایه میکند: با پیشوند (بوف*)، صافی ستون (author:هدایت)، OR، رتبهبندی و برجستهسازی؛ متن جستجو هم فقط یک پارامتر دیگر است. VACUUM INTO رونوشتی تمیز و یکپارچه از پایگاه دادهی باز را در پروندهای تازه مینویسد و اجرای آن هنگامی که برنامه با پایگاه داده کار میکند بیخطر است.
واردسازی دیتابیس.اس کیو لایت
واردسازی سیستم عامل
تابع ریشه:
پایگاه := اس کیو لایت.بازکردن("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")، "امانت دارد"
پایانجدول جستجو اینجا یک بار از books پر میشود. در برنامهی واقعی آن را با تریگرهای روی books همگام نگه دارید یا پس از تغییرها دوباره بسازید. FTS5 بخشی از کتابخانهی sqlite3 است که بیشتر سیستمها همراه دارند. توکنساز پیشفرض آن واژههای فارسی را هم درست جدا میکند، اما ریشهیابی نمیکند؛ برای همین امضا* با ستاره نوشته شده تا امضای را هم پیدا کند.
بیشتر
پرسمان عددوپرسمان متننخستین ستون نخستین ردیف را در یک فراخوانی برمیگردانند، برای شمارشها و مقدارهای تکی. وقتی ردیفی نباشد ۰ یا""برمیگردانند و پارامتر نمیگیرند، پس فقط با SQL که خودتان نوشتهاید به کارشان ببرید.- هر مقدار
پایگاه دادهیک اتصال است. آن را میان نخهایی که همزمان مینویسند شریک نکنید؛ به هر نخبازکردنجداگانهای از همان پرونده بدهید، همانطور که راهنمای پایین نشان میدهد. دیتابیس یکاستخرکوچک هم دارد که هر مقداراتصالرا نگه میدارد. INSERT ... RETURNINGوON CONFLICT ... DO UPDATE(درج یا بهروزرسانی) باآماده سازیکار میکنند: یک گام بروید و ستونهای برگشتی را بخوانید.تعداد ستون،نام ستونونوع ستوننتیجهای را توصیف میکنند که خودتان ننوشتهاید، برای یک نمایشگر جدول یا خروجی گرفتن.- دادهی دودویی (BLOB) در این بسته تابع اتصال ندارد؛ آن را به شکل متن hex یا base64 ذخیره کنید.
راهنما: شمارنده با درج یا بهروزرسانی
شمارندهی بازدید، محدودکنندهی نرخ یا شمار موجودی به این نیاز دارد: «یکی اضافه کن، یا ردیف را با یک بساز». ON CONFLICT (key) DO UPDATE این کار را در یک دستور و بدون رقابت میان خواندن و نوشتن انجام میدهد و RETURNING مقدار تازه را برمیگرداند که مثل یک پرسمان با بعدی و عدد صحیح خوانده میشود.
واردسازی دیتابیس.اس کیو لایت
تابع بازدید(پایگاه: اس کیو لایت.پایگاه داده، صفحهی وب: رشته): صحیح:
دستور := اس کیو لایت.آماده سازی(پایگاه، "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")
تا اس کیو لایت.بعدی(ردیفها):
سرچاپ اس کیو لایت.عدد صحیح(ردیفها، ۱)، اس کیو لایت.متن(ردیفها، ۰)
پایان
اس کیو لایت.پایان(ردیفها)
پایانراهنما: چاپ هر پرسمان به شکل جدول
وقتی ستونها از پیش معلوم نیستند، مثل صفحهی مدیریت، خروجی گرفتن یا ابزار اشکالیابی، از خود نتیجه بپرسید. تعداد ستون و نام ستون سرستون را میدهند و متد نوع ستون برای هر مقدار ردیف جاری یکی از ثابتهای مشترک دیتابیس را برمیگرداند (نوع خالی، نوع صحیح، نوع اعشاری، نوع متن، نوع دودویی). یک ستون میتواند در هر ردیف نوع دیگری داشته باشد، پس برای هر ردیف بپرسید، نه یک بار.
واردسازی دیتابیس
واردسازی دیتابیس.اس کیو لایت
تابع خانه(ردیفها: اس کیو لایت.ردیف ها، ستون: صحیح): رشته:
ترابرد ردیفها.نوع ستون(ستون):
دیتابیس.نوع خالی: برگشت "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")
پایانتابع بستهای اس کیو لایت.نوع ستون بهجای آن کدهای خود SQLite را برمیگرداند که در آن ۵ یعنی NULL؛ متدی که اینجا آمده آن را به دیتابیس.نوع خالی یعنی ۰ تبدیل میکند.
راهنما: چند اتصال به یک پرونده
دو برنامه، یا دو نخ با اتصالهای جدا، میتوانند یک پرونده را باز کنند. در حالت WAL خوانندهها آخرین وضعیت ثبتشده را میبینند و هیچوقت پشت یک نویسنده نمیمانند، ولی در هر لحظه فقط یک نویسنده قفل نوشتن را دارد. نویسندهی دوم فورا پیام database is locked میگیرد، یا اگر busy_timeout تنظیم شده باشد پس از آن چند میلیثانیه انتظار.
واردسازی دیتابیس.اس کیو لایت
واردسازی سیستم عامل
تابع ریشه:
مسیر := "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")
اس کیو لایت.بستن(خواننده)
اس کیو لایت.بستن(نویسنده)
سیستم عامل.حذف(مسیر)
پایانتراکنشهای نوشتن را کوتاه نگه دارید، روی هر اتصال busy_timeout بگذارید و نوشتنی را که باز هم با database is locked شکست خورد دوباره امتحان کنید. برای سرور وبی پرکار با نویسندههای همزمان زیاد، پایگاه دادهی سروری مثل PostgreSQL انتخاب بهتری است.
راهنما: ستونهای JSON
SQLite متن JSON را نگه میدارد و تابعهایی برای بررسی و خواندن آن در خود SQL دارد، پس دادهی بیشکل ثابت، مثل گزارش رویدادها یا تنظیمات، میتواند کنار ستونهای معمولی بنشیند. CHECK (json_valid(body)) هنگام درج JSON خراب را رد میکند، ->> یک فیلد را میخواند و json_group_object از ردیفها یک شیء میسازد. درج ردشده این را هم نشان میدهد که بازنشانی وقتی آخرین اجرای دستور شکست خورده باشد ۱- برمیگرداند.
واردسازی دیتابیس.اس کیو لایت
تابع ریشه:
پایگاه := اس کیو لایت.بازکردن(":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)")
پایانراهنما: کدام تابع برای کدام کار
| کار | ابزار |
|---|---|
| ساخت جدول، اجرای یک اسکریپت ثابت | اجرا (یک یا چند دستور) |
| هر SQL با مقداری از بیرون | آماده سازی، اتصال ...، بعدی، پایان |
| یک دستور برای ردیفهای بسیار | یک بار آماده سازی، سپس برای هر ردیف بازنشانی و اتصال دوباره، درون شروع تراکنش و ثبت تراکنش |
| خواندن نتیجه | تا بعدی(ردیفها): با متن، عدد صحیح، عدد صحیح۶۴، عدد اعشار، خالی است |
| یک عدد یا یک رشته با SQL ثابت | پرسمان عدد، پرسمان متن |
| شناسهی ردیف تازه، شمار ردیفهای تغییرکرده | شناسه آخرین درج، تعداد تغییرات، مجموع تغییرات |
| همه یا هیچ | شروع تراکنش، ثبت تراکنش، بازگردانی، یا دیتابیس.در تراکنش از راه اتصال |
| کدی که روی MySQL یا PostgreSQL هم اجرا شود | اتصال و تابعهای کمکی دیتابیس |
| فهمیدن اینکه چه چیزی خراب شد | دستور معتبر، مقدار برگشتی پایان یا بازنشانی، سپس خطا |
گونهها
پایگاه داده Database
ساختار پایگاه داده| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| دسته | handle | تهی* | اشارهگر SQLite. |
واردسازی دیتابیس
واردسازی دیتابیس.اس کیو لایت
تابع ریشه:
پ := اس کیو لایت.بازکردن(":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") != ۰، پ.خطا()
سرچاپ پ.بستن()
پایاننوع Kind
تابع نوع(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam
پینگ Ping
تابع پینگ(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam
اجرا Exec
تابع اجرا(sql: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Methods.salam
پرسمان Query
تابع پرسمان(sql: رشته): dyn db.ردیف هامعتبر نادرست است.نمونهی این مورد همراه با موارد بالاتر آمده است: 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: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: 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 | تهی* | اشارهگر پایگاه داده. |
واردسازی دیتابیس.اس کیو لایت
تابع ریشه:
سرچاپ اس کیو لایت.در دسترس()، اس کیو لایت.نسخه().طول() > ۰
پ := اس کیو لایت.بازکردن(":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") != ۰
سرچاپ اس کیو لایت.خطا(پ)
_ := اس کیو لایت.بستن(پ)
پایانمعتبر 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
تابع در دسترس(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam
نسخه Version
تابع نسخه(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam
بازکردن Open
تابع بازکردن(path: رشته): پایگاه داده:memory: یا مسیر خالی یعنی پایگاه دادهی موقت در حافظه. حتی وقتی پرونده باز نمیشود هم دستگیره برمیگردد، پس نخستین دستور را بررسی کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam
معتبر Ok
تابع معتبر(db: پایگاه داده): منطقی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: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: 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: صحیح): صحیحنوع ستون ردیفها بهجای آن ثابتهای مشترک را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam
خالی است IsNull
تابع خالی است(rows: ردیف ها، col: صحیح): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam
پرسمان عدد QueryInt
تابع پرسمان عدد(db: پایگاه داده، sql: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam
پرسمان متن QueryText
تابع پرسمان متن(db: پایگاه داده، sql: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: db-sqlite-Basics.salam