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/