پنجشنبه, ۹ اسفند, ۱۴۰۳ / 27 February, 2025
مجله ویستا

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


مروری بر دیتابیس 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 به‌شمار می‌رود.

محمدرضا قربانی