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

 

وقتي صحبت از ديتابيس‌هاي رابطه‌اي مي‌شود، توسعه‌دهندگان نرم‌افزار و مديران سيستم به‌ياد MySQL و POstgreSQL مي‌افتند. اين‌دو‌ديتابيس، هر چند بسيار قدرتمند هستند، اما در محيط‌هاي كوچك‌تر، وقتي نياز به يك ديتابيس سبك و سريع داريم، كارا نيستند. بنابراين اينجاست كه SQLite خودش را نشان مي‌دهد. بسياري از محصولات منبع‌باز و تجاري از اين ديتابيس در نرم‌افزار خود استفاده كرده‌اند و احتمال مي‌رود محبوب‌ترين ديتابيس پياده‌سازي شده در نرم‌افزارها و اسكريپت‌هاي فعلي دنيا باشد.نيازمندي‌هاي اين ديتابيس جمع‌ و جور بسيار اندك است، دستگاه‌هايي مثل تلفن‌ همراه، بازي‌هاي‌ رايانه‌اي و پخش‌كننده‌هاي قابل حمل صدا و تصوير مي‌توانند كتابخانه‌هاي بزرگ داده خود را در SQLite قرار دهند. با وجود حجم كمي كه اين ديتابيس اشغال مي‌كند، بيشتر قابليت‌هاي استاندارد SQL-92 را پياده‌سازي كرده است و اگر با ديگر ديتابيس‌ها كار كرده باشيم، كار كردن با آن ابدا دشوار نخواهد بود. سادگي آن باعث مي‌شود كاركردن با ديتابيس براي كسي كه تازه وارد دنياي SQL شده است نيز دشوار نباشد.آخرين نسخه SQLite، نسخه 3 آن است كه مي‌توان بسته‌هاي نصب آن را براي ويندوز، BSD و لينوكس دريافت كرد. در CentOS، Mac OS X و Open BSD به‌صورت پيش‌فرض نصب شده است و نيازي به نصب مجدد آن نيست.كتابخانه‌ SQLite مستقيما مي‌تواند در برنامه‌هاي C و ++C قرار بگيرد. پايتون نيز از نسخه 2.5 و پي‌اچ‌پي به صورت خودكار از آن پشتيباني مي‌كنند. براي استفاده از طريق Perl بايد DBI و DBD::SQLite را نصب كرد.از آنجا كه هيچ سروري در اين ديتابيس وجود ندارد، مي‌توان مستقيما و از طريق خط فرمان، مسير فايل اجرايي را وارد و ديتابيس مورد نظر را ساخت:

$ sqlite3 servers.sqlite3

SQLite version 3.7.14.1 2012-10-04 19:37:12

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.sqlite3"

 

printf "Hostname: "

read _HOSTNAME

 

printf "${_HOSTNAME}'s IP Address: "

read _IP

 

printf "${_HOSTNAME}'s role: "

read _ROLE

 

sqlite3 $_DB "INSERT INTO Servers(Hostname, IPAddress, Role)

VALUES('${_HOSTNAME}', '${_IP}', '${_ROLE}')"

اگر اين اسكريپت را اجرا كنيم، يكي دو ركورد در ديتابيس‌مان ذخيره خواهد شد.

$ ./server_add.sh

Hostname: mx1

mx1's IP Address: 1.2.3.4

mx1's role: Mail

 

$ ./server_add.sh

Hostname: www1

www1's IP Address: 2.3.4.5

www1's role: Web

دستور sqlite3 مي‌تواند يك عبارت SQL را با اجراي آرگومان سومي بعد از نام فايل اجرا كند. انتهاي دستور دوباره نقطه ويرگول قرار داده مي‌شود.

$ sqlite3 servers.sqlite3 "SELECT * FROM Servers"

mx1|1.2.3.4|Mail||

www1|2.3.4.5|Web||

اسكريپت‌هاي شلي را به همين ترتيب مي‌توان ايجاد كرد كه كارهاي مختلف مديريت سيستم را انجام دهد و حتي برنامه‌هايي بسيار ساده با قابليت ذخيره گزارش داشته باشيم.در مثال بعدي، به‌طور گسترده‌تري از ديتابيسي كه ساخته‌ايم استفاده خواهيم كرد. اسكريپت ساخته شده را به كمك Cron در فواصل زماني مختلف اجرا مي‌كنيم. اين اسكريپت سرورهاي شبكه را چك و ستون Status و Timestamp هر سرور را در ديتابيس به‌روز مي‌كند.

#!/usr/bin/env perl

 

use strict;

use warnings;

use DBI;

my $db = "servers.sqlite3";

my $dbh = DBI-»connect(

"DBI:SQLite:${db}",

undef, undef,

{ RaiseError =» 1 }

) or die "Can't connect to database: $DBI::errstr";

sub server_check {

my ($hostname, $ip, $role) = @_;

print "Add check logic based on hostname, ip and server role\n";

return 1;

}

my $servers = $dbh-»selectall_arrayref("SELECT * FROM Servers");

foreach my $server (@$servers) {

variables

my ($hostname, $ip, $role, $status, $timestamp) = @$server;

my $rc = server_check($hostname, $ip, $role);

if($rc » 0) {

$status = 'good';

} else {

$status = 'bad';

}

current

my $sth = $dbh-»prepare(

"UPDATE Servers SET Status = ?, Timestamp = ?" );

$sth-»execute($status, time());

}

$dbh-»disconnect();

اين برنامه منطق كافي براي تشخيص مقدار صحيح را ندارد و همواره True را قرار مي‌دهد. با استفاده از Curl، LWP يا ابزارهاي ديگر مي‌توان سابروتين مربوط را ايجاد كرد.مثال بعدي، نرم‌افزار كوچكي است كه با استفاده از PHP نوشته شده است. از طريق افزونه PDO مي‌توان از SQLite استفاده كرد. PDO شباهت زيادي به ماژول DBI در پرل دارد كه در مثال قبلي از آن استفاده شد. قطعه كد زير را ببينيد:

«?php

try {

$db = 'servers.sqlite3';

$dbh = new PDO("sqlite:$db");

 

$servers = $dbh-»prepare( "SELECT * FROM Servers" );

$servers-»execute();

} catch (Exception $e) { die ($e); }

نرم‌افزارها و برنامه‌هاي تحت وب زيادي وجود دارد كه مديريت ديتابيس‌هاي SQLite را بسرعت و بسادگي انجام مي‌دهد. يكي از برنامه‌هاي تحت وب مديريت SQL، Adminer است كه MySQL، PostgreSQL، MSSQL، Oracle و SQLite را در فهرست پشتيباني خودش دارد.از SQLite مي‌توان در پروژه‌هاي بزرگي مثل نرم‌افزارهاي تحت وب استفاده كرد تا در مصرف منابع سيستمي صرفه‌جويي شود. هر چند بايد محدوديت‌هاي استفاده از SQLite را شناخت و آنها را بدرستي استفاده كرد. SQLite امكان دسترسي از طريق چند پروسس همزمان را مي‌دهد و مكانيزم قفل كردن خاص خودش را دارد، اما دقت ديگر موتورهاي ديتابيس از جمله PostgreSQL بالاتر است. اين‌ديتابيس‌ها همچنين پديده‌اي به‌نام سطوح دسترسي و احراز هويت را ندارند و اين يكي از نقص‌هاي فايل‌هاي SQLite به‌شمار مي‌رود.





تاريخ : سه شنبه 28 آذر 1391برچسب:, | | نویسنده : مقدم |