مروری بر دیتابیس SQLite




وقتی صحبت از دیتابیس های رابطه ای می شود، توسعه دهندگان نرم افزار و مدیران سیستم به یاد MySQL و POstgreSQL می افتند. وقتی صحبت از دیتابیس های رابطه ای می شود، توسعه دهندگان نرم افزار و مدیران سیستم به یاد MySQL و POstgreSQL می افتند. این دو دیتابیس، هر چند بسیار قدرتمند هستند، اما در محیط های کوچک تر، وقتی نیاز به یک دیتابیس سبک و سریع داریم، کارا نیستند. بنابراین اینجاست که SQLite خودش را نشان می دهد. بسیاری از محصولات منبع باز و تجاری از این دیتابیس در نرم افزار خود استفاده کرده اند و احتمال می رود محبوب ترین دیتابیس پیاده سازی شده در نرم افزارها و اسکریپت های فعلی دنیا باشد. نیازمندی های این دیتابیس جمع و جور بسیار اندک است، دستگاه هایی مثل تلفن همراه، بازی های رایانه ای و پخش کننده های قابل حمل صدا و تصویر می توانند کتابخانه های بزرگ داده خود را در SQLite قرار دهند. با وجود حجم کمی که این دیتابیس اشغال می کند، بیشتر قابلیت های استاندارد SQL ۹۲ را پیاده سازی کرده است و اگر با دیگر دیتابیس ها کار کرده باشیم، کار کردن با آن ابدا دشوار نخواهد بود. سادگی آن باعث می شود کارکردن با دیتابیس برای کسی که تازه وارد دنیای SQL شده است نیز دشوار نباشد. آخرین نسخه SQLite، نسخه ۳ آن است که می توان بسته های نصب آن را برای ویندوز، BSD و لینوکس دریافت کرد. در CentOS، Mac OS X و Open BSD به صورت پیش فرض نصب شده است و نیازی به نصب مجدد آن نیست. کتابخانه SQLite مستقیما می تواند در برنامه های C و ++C قرار بگیرد. پایتون نیز از نسخه ۲.۵ و پی اچ پی به صورت خودکار از آن پشتیبانی می کنند. برای استفاده از طریق Perl باید DBI و DBD::SQLite را نصب کرد. از آنجا که هیچ سروری در این دیتابیس وجود ندارد، می توان مستقیما و از طریق خط فرمان، مسیر فایل اجرایی را وارد و دیتابیس مورد نظر را ساخت: $ sqlite۳ servers.sqlite۳ SQLite version ۳.۷.۱۴.۱ ۲۰۱۲ ۱۰ ۰۴ ۱۹:۳۷:۱۲ Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite» اگر نام فایل قبلا وجود نداشته باشد، دیتابیس جدیدی ایجاد می شود. می توان هر پسوندی را برای نام فایل انتخاب کرد. نام هایی چونdb. از متداول ترین پسوندها برای SQLite است. دستورهای SQL را می توان مستقیما وارد سیستم کرد، همچنین می توان به پیکربندی دیتابیس و انجام کارهای مدیریتی پرداخت. با تایپhelp. فهرستی از متادستورهای پشتیبانی شده نشان داده می شود. بیایید جدول کوچکی ایجاد کنیم تا اطلاعاتی در مورد سرورهای موجود در شبکه مان ذخیره کنیم. sqlite» CREATE TABLE Servers( Hostname TEXT PRIMARY KEY, IPAddress TEXT, Role TEXT, Status TEXT, Timestamp INT ); sqlite» .tables Servers این دستور، همان دستور آشنا و استاندارد SQL است که با نقطه ویرگول به پایان رسیده است. SQLite از چند دیتاتایپ پشتیبانی می کند: NULL برای خالی بودن، INTEGER و REAL برای اعداد علامت دار و ممیز دار، TEXT برای متون و BLOB برای فایل های باینری. برخلاف دیگر دیتابیس های SQL، SQLite از تایپ دینامیک استفاده می کند و دیتاتایپ یک مقدار با خود مقدار تعیین می شود و ارتباطی به ظرفش ندارد. در نتیجه می توان هر مقداری را در هر ستون قرار داد و کاری به نوع ذخیره شده نداشت. دستورtable. فهرستی از جداول موجود در دیتابیس را نشان می دهد. حالا می توان تعدادی رکورد در جدول مان ذخیره کنیم یا این کار را از طریق یک اسکریپت پوسته انجام دهیم. #!/bin/sh _DB="servers.sqlite۳" printf "Hostname: " read _HOSTNAME printf "۰۳۹;s IP Address: " read _IP printf "۰۳۹;s role: " read _ROLE sqlite۳ "INSERT INTO Servers(Hostname, IPAddress, Role) VALUES(۰۳۹;۰۳۹;, ۰۳۹;۰۳۹;, ۰۳۹;۰۳۹;)" اگر این اسکریپت را اجرا کنیم، یکی دو رکورد در دیتابیس مان ذخیره خواهد شد. $ ./server_add.sh Hostname: mx۱ mx۱۰۳۹;s IP Address: ۱.۲.۳.۴ mx۱۰۳۹;s role: Mail $ ./server_add.sh Hostname: www۱ www۱۰۳۹;s IP Address: ۲.۳.۴.۵ www۱۰۳۹;s role: Web دستور sqlite۳ می تواند یک عبارت SQL را با اجرای آرگومان سومی بعد از نام فایل اجرا کند. انتهای دستور دوباره نقطه ویرگول قرار داده می شود. $ sqlite۳ servers.sqlite۳ "SELECT * FROM Servers" mx۱|۱.۲.۳.۴|Mail|| www۱|۲.۳.۴.۵|Web|| اسکریپت های شلی را به همین ترتیب می توان ایجاد کرد که کارهای مختلف مدیریت سیستم را انجام دهد و حتی برنامه هایی بسیار ساده با قابلیت ذخیره گزارش داشته باشیم. در مثال بعدی، به طور گسترده تری از دیتابیسی که ساخته ایم استفاده خواهیم کرد. اسکریپت ساخته شده را به کمک Cron در فواصل زمانی مختلف اجرا می کنیم. این اسکریپت سرورهای شبکه را چک و ستون Status و Timestamp هر سرور را در دیتابیس به روز می کند. #!/usr/bin/env perl use strict; use warnings; use DBI; my = "servers.sqlite۳"; my = DBI »connect( "DBI:SQLite:", undef, undef, { RaiseError =» ۱ } ) or die "Can۰۳۹;t connect to database: ::errstr"; sub server_check { my (, , ) = @_; print "Add check logic based on hostname, ip and server role "; return ۱; } my = »selectall_arrayref("SELECT * FROM Servers"); foreach my (@) { variables my (, , , , ) = @; my = server_check(, , ); if( » ۰) { = ۰۳۹;good۰۳۹;; } else { = ۰۳۹;bad۰۳۹;; } current my = »prepare( "UPDATE Servers SET Status = ?, Timestamp = ?" ); »execute(, time()); } »disconnect(); این برنامه منطق کافی برای تشخیص مقدار صحیح را ندارد و همواره True را قرار می دهد. با استفاده از Curl، LWP یا ابزارهای دیگر می توان سابروتین مربوط را ایجاد کرد. مثال بعدی، نرم افزار کوچکی است که با استفاده از PHP نوشته شده است. از طریق افزونه PDO می توان از SQLite استفاده کرد. PDO شباهت زیادی به ماژول DBI در پرل دارد که در مثال قبلی از آن استفاده شد. قطعه کد زیر را ببینید: «?php try { = ۰۳۹;servers.sqlite۳۰۳۹;; = new PDO("sqlite:"); = »prepare( "SELECT * FROM Servers" ); »execute(); } catch (Exception ) { die (); } ?» نرم افزارها و برنامه های تحت وب زیادی وجود دارد که مدیریت دیتابیس های SQLite را بسرعت و بسادگی انجام می دهد. یکی از برنامه های تحت وب مدیریت SQL، Adminer است که MySQL، PostgreSQL، MSSQL، Oracle و SQLite را در فهرست پشتیبانی خودش دارد. از SQLite می توان در پروژه های بزرگی مثل نرم افزارهای تحت وب استفاده کرد تا در مصرف منابع سیستمی صرفه جویی شود. هر چند باید محدودیت های استفاده از SQLite را شناخت و آنها را بدرستی استفاده کرد. SQLite امکان دسترسی از طریق چند پروسس همزمان را می دهد و مکانیزم قفل کردن خاص خودش را دارد، اما دقت دیگر موتورهای دیتابیس از جمله PostgreSQL بالاتر است. این دیتابیس ها همچنین پدیده ای به نام سطوح دسترسی و احراز هویت را ندارند و این یکی از نقص های فایل های SQLite به شمار می رود.