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

Дополнительная информация:

[править] 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

Добавляем записи из 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

[править] Примечания

  1. Но тут уже уверенным быть нельзя. Более полный список пользователей: http://www.sqlite.org/famous.html
  2. http://justatheory.com/computers/databases/sqlite/add_regexen.html
  3. http://old.nabble.com/Attempting-to-merge-large-databases-td18131366.html
  4. В Vimperator его можно вызывать так: :e chrome://sqlitemanager/content/
Источник — «http://xgu.ru/wiki/SQLite»