SQLite
Материал из Xgu.ru
SQLite — встраиваемая в процесс реализация SQL-машины. Слово SQL-сервер здесь не используем, потому что как таковой сервер там не нужен — весь функционал, который встраивается в SQL-сервер, реализован внутри библиотеки (и, соответственно, внутри программы, которая её использует).
В ситуации, когда нужно встроить СУБД в приложение, хорошо подходит Berkeley DB, однако если есть необходимость осуществления поиска по части ключа или необходимость в выполнении сложных запросов, эта библиотека не так хорошо справляется как SQLite.
SQLite является открытым и полностью свободным программным обеспечением, распространяющимся как общественное достояние (public domain). Лицензия не накладывает никаких ограничений на то, как будет использоваться код, в том числе она позволяет взять его как часть закрытого проекта. Поэтому, SQLite может использоваться где угодно. В частности, SQLite используется в iPhone и iTunes, в Symbian и Android, встроен в Python и PHP, и предполагается, что он используется в клиенте Skype[1]. С учётом того, куда встроена SQLite, вероятно, это сегодня наиболее распространённая в мире СУБД.
Содержание |
[править] Особенности реализации
База данных в SQLite представлена в виде отдельного файла. Блокировка на запись реализована очень просто -- файл блокируется целиком. Не поддерживается запись в виды (views). Только частично поддерживаются триггеры.
[править] Примеры использования
[править] Shell
#!/bin/sh sqlite3 test.db "create table n (id INTEGER PRIMARY KEY,f TEXT,l TEXT);" sqlite3 test.db "insert into n (f,l) values ('john','smith');" sqlite3 test.db "select * from n";
[править] Perl
#!/usr/bin/perl -w use DBI; use strict; my $db = DBI->connect("dbi:SQLite:test.db", "", "", {RaiseError => 1, AutoCommit => 1}); $db->do("CREATE TABLE n (id INTEGER PRIMARY KEY, f TEXT, l TEXT)"); $db->do("INSERT INTO n VALUES (NULL, 'john', 'smith')"); my $all = $db->selectall_arrayref("SELECT * FROM n"); foreach my $row (@$all) { my ($id, $first, $last) = @$row; print "$id|$first|$lastn"; }
Можно добавлять свои собственные функции, реализованные на Perl, в SQL. Например, вот так можно создать какую-нибудь функцию:
Кроме того, в SQLite есть специальные заглушки, такие как REGEX и MATCH, которые активируются, если добавить поддержку функций regex и match. Вот так создаётся функция regex, которая осуществляет поиск по регулярному выражению[2]:
$dbh = DBI->connect('dbi:SQLite:dbfile=test.db'); $dbh->func('regexp', 2, sub { my ($regex, $string) = @_; return $string =~ /$regex/; }, 'create_function');
Дальше новую функцию можно использовать прямо в SQL-запросах:
SELECT a FROM try WHERE a REGEXP 'a.*b'
Дополнительная информация:
- DBI (англ.) — модуль DBI; интерфейс к СУБД в Perl
- DBD::SQLite (англ.) — модуль DBD::SQLite; надстройка над DBI, предназначенная для работы с SQLite
[править] Python
PySQLite входит в состав Python начиная с Python 2.5.
Простейший пример использования:
#!/usr/bin/python import sqlite3 db = sqlite3.connect('test.db') cur = db.cursor() cur.execute('CREATE TABLE n (id INTEGER PRIMARY KEY, f TEXT, l TEXT)') db.commit() cur.execute('INSERT INTO n (id, f, l) VALUES(NULL, "john", "smith")') db.commit() cur.execute('SELECT * FROM n') print cur.fetchall()
Использование функций Python в SQLite[1]:
import sqlite3 db_filename = 'todo.db' def encrypt(s): print 'Encrypting %r' % s return s.encode('rot-13') def decrypt(s): print 'Decrypting %r' % s return s.encode('rot-13') with sqlite3.connect(db_filename) as conn: conn.create_function('encrypt', 1, encrypt) conn.create_function('decrypt', 1, decrypt) cursor = conn.cursor() # Raw values print 'Original values:' query = "select id, details from task" cursor.execute(query) for row in cursor.fetchall(): print row print '\nEncrypting...' query = "update task set details = encrypt(details)" cursor.execute(query) print '\nRaw encrypted values:' query = "select id, details from task" cursor.execute(query) for row in cursor.fetchall(): print row print '\nDecrypting in query...' query = "select id, decrypt(details) from task" cursor.execute(query) for row in cursor.fetchall(): print row
Дополнительная информация:
- sqlite3 – Embedded Relational Database @ Doug Hellman's Blog
[править] Ruby
#!/usr/bin/ruby require 'sqlite3' db = SQLite3::Database.new( 'test.db') db.execute "CREATE TABLE n (id INTEGER PRIMARY KEY,f TEXT,l TEXT);" db.execute "INSERT INTO n (f,l) values ('john','smith');" db.results_as_hash=true db.execute "SELECT * FROM N;" do |n| puts "%s|%s|%s" % [ n['id'], n['f'], n['l'] ] end
Дополнительная информация:
- SQLite/Ruby FAQ (англ.)
- A Quick Guide to SQLite and Ruby (англ.) — Хорошее введение в тему, хотя и устаревшее
[править] Вопросы и ответы
[править] Как объединить несколько баз SQLite
Добавляем записи из b.sqlite в a.sqlite[3]:
sqlite3 a.sqlite sqlite> attach b.sqlite as toMerge; sqlite> BEGIN: sqlite> insert into AuditRecords select * from toMerge.AuditRecords; sqlite> COMMIT; sqlite> detach database toMerge;
[править] Дополнительная информация
- MySQL 2 SQLite (англ.) — Как перетянуть данные из MySQL в SQLite
- SQLite Manager (англ.) — очень удобный менеджер SQLite (поудобнее чем SQLite Browser), который представляет собой модуль расширений (plugin) для firefox[4]
- SQLite FTS3 Extension (англ.) — полнотекстовый поиск для SQLite
[править] Примечания
- ↑ Но тут уже уверенным быть нельзя. Более полный список пользователей: http://www.sqlite.org/famous.html
- ↑ http://justatheory.com/computers/databases/sqlite/add_regexen.html
- ↑ http://old.nabble.com/Attempting-to-merge-large-databases-td18131366.html
- ↑ В Vimperator его можно вызывать так: :e chrome://sqlitemanager/content/