Расширение SQLite
Расширение SQLite позволяет DuckDB напрямую читать и записывать данные из файла базы данных SQLite. Данные могут быть запрошены напрямую из базовых таблиц SQLite. Данные могут быть загружены из таблиц SQLite в таблицы DuckDB, или наоборот.
Установка и загрузка
Расширение sqlite будет прозрачно автозагружаться при первом использовании из официального репозитория расширений. Если вы хотите установить и загрузить его вручную, выполните:
INSTALL sqlite; LOAD sqlite;
Использование
Чтобы предоставить доступ к файлу SQLite для DuckDB, используйте инструкцию ATTACH с типом SQLITE или SQLITE_SCANNER. Присоединённые базы данных SQLite поддерживают операции чтения и записи.
Например, чтобы подключиться к файлу sakila.db, выполните:
ATTACH 'sakila.db' (TYPE SQLITE); USE sakila;
Таблицы в файле могут быть прочитаны как обычные таблицы DuckDB, но основополагающие данные читаются непосредственно из таблиц SQLite в файле во время запроса.
SHOW TABLES;
| name |
|---|
| actor |
| address |
| category |
| city |
| country |
| customer |
| customer_list |
| film |
| film_actor |
| film_category |
| film_list |
| film_text |
| inventory |
| language |
| payment |
| rental |
| sales_by_film_category |
| sales_by_store |
| staff |
| staff_list |
| store |
Вы можете запрашивать таблицы с помощью SQL, например, используя примеры запросов из sakila-examples.sql:
SELECT
cat.name AS category_name,
sum(ifnull(pay.amount, 0)) AS revenue
FROM category cat
LEFT JOIN film_category flm_cat
ON cat.category_id = flm_cat.category_id
LEFT JOIN film fil
ON flm_cat.film_id = fil.film_id
LEFT JOIN inventory inv
ON fil.film_id = inv.film_id
LEFT JOIN rental ren
ON inv.inventory_id = ren.inventory_id
LEFT JOIN payment pay
ON ren.rental_id = pay.rental_id
GROUP BY cat.name
ORDER BY revenue DESC
LIMIT 5; Типы данных
SQLite — это система баз данных со слабой типизацией. Поэтому при хранении данных в таблице SQLite типы не проверяются. Следующее является корректным SQL-запросом в SQLite:
CREATE TABLE numbers (i INTEGER);
INSERT INTO numbers VALUES ('hello'); DuckDB — это система баз данных с сильной типизацией, поэтому все столбцы должны иметь определённые типы, и система тщательно проверяет корректность данных.
При запросе к SQLite DuckDB должен вывести соответствие типов столбцов. DuckDB следует правилам родственности типов SQLite с некоторыми расширениями.
- Если объявленный тип содержит строку
INT, то он преобразуется в типBIGINT - Если объявленный тип столбца содержит любую из строк
CHAR,CLOB, илиTEXT, то он преобразуется вVARCHAR. - Если объявленный тип столбца содержит строку
BLOBили тип не указан, то он преобразуется вBLOB. - Если объявленный тип столбца содержит любую из строк
REAL,FLOA,DOUB,DECилиNUM, то он преобразуется вDOUBLE. - Если объявленный тип —
DATE, то он преобразуется вDATE. - Если объявленный тип содержит строку
TIME, то он преобразуется вTIMESTAMP. - Если ни одно из вышеперечисленных условий не выполняется, то он преобразуется в
VARCHAR.
Поскольку DuckDB требует, чтобы соответствующие столбцы содержали только значения правильного типа, мы не можем загрузить строку “hello” в столбец типа BIGINT. В связи с этим при чтении из таблицы “numbers” выше выбрасывается ошибка:
Error: Mismatch Type Error: Invalid type in column "i": column was declared as integer, found "hello" of type "text" instead.
Эту ошибку можно избежать, установив опцию sqlite_all_varchar:
SET GLOBAL sqlite_all_varchar = true;
При установке эта опция переопределяет правила преобразования типов, описанные выше, и вместо этого всегда преобразует столбцы SQLite в столбец типа VARCHAR. Обратите внимание, что это значение должно быть установлено до вызова sqlite_attach.
Открытие баз данных SQLite напрямую
Базы данных SQLite также могут быть открыты напрямую и могут быть использованы прозрачно вместо файла базы данных DuckDB. В любом клиенте при подключении можно указать путь к файлу базы данных SQLite, и вместо этого будет открыта база данных SQLite.
Например, в оболочке база данных SQLite может быть открыта следующим образом:
duckdb sakila.db
SELECT first_name FROM actor LIMIT 3;
| first_name |
|---|
| PENELOPE |
| NICK |
| ED |
Запись данных в SQLite
В дополнение к чтению данных из SQLite, расширение также позволяет создавать новые файлы баз данных SQLite, создавать таблицы, загружать данные в SQLite и вносить другие изменения в файлы баз данных SQLite с помощью стандартных SQL-запросов.
Это позволяет использовать DuckDB для, например, экспорта данных, хранящихся в базе данных SQLite, в Parquet или для чтения данных из файла Parquet в SQLite.
Ниже приведен краткий пример того, как создать новую базу данных SQLite и загрузить в неё данные.
ATTACH 'new_sqlite_database.db' AS sqlite_db (TYPE SQLITE); CREATE TABLE sqlite_db.tbl (id INTEGER, name VARCHAR); INSERT INTO sqlite_db.tbl VALUES (42, 'DuckDB');
Полученная база данных SQLite затем может быть прочитана из SQLite.
sqlite3 new_sqlite_database.db
SQLite version 3.39.5 2022-10-14 20:58:05 sqlite> SELECT * FROM tbl;
id name -- ------ 42 DuckDB
Поддерживается множество операций над таблицами SQLite. Все эти операции непосредственно изменяют базу данных SQLite, и результаты последующих операций могут быть прочитаны с помощью SQLite.
Конкурентность
DuckDB может читать или изменять базу данных SQLite, в то время как DuckDB или SQLite читают или изменяют ту же базу данных из другого потока или отдельного процесса. Несколько потоков или процессов могут одновременно читать базу данных SQLite, но только один поток или процесс может одновременно записывать в базу данных. Блокировка базы данных обрабатывается библиотекой SQLite, а не DuckDB. В пределах одного процесса SQLite использует мьютексы. При доступе из разных процессов SQLite использует блокировки файловой системы. Механизмы блокировки также зависят от конфигурации SQLite, например, от режима WAL. Для получения дополнительной информации обратитесь к документации SQLite по блокировкам.
Предупреждение Связывание нескольких копий библиотеки SQLite в одно приложение может привести к ошибкам приложения. См. проблему sqlite_scanner #82 для получения дополнительной информации.
Поддерживаемые операции
Ниже приведен список поддерживаемых операций.
CREATE TABLE
CREATE TABLE sqlite_db.tbl (id INTEGER, name VARCHAR);
INSERT INTO
INSERT INTO sqlite_db.tbl VALUES (42, 'DuckDB');
SELECT
SELECT * FROM sqlite_db.tbl;
| id | name |
|---|---|
| 42 | DuckDB |
COPY
COPY sqlite_db.tbl TO 'data.parquet'; COPY sqlite_db.tbl FROM 'data.parquet';
UPDATE
UPDATE sqlite_db.tbl SET name = 'Woohoo' WHERE id = 42;
DELETE
DELETE FROM sqlite_db.tbl WHERE id = 42;
ALTER TABLE
ALTER TABLE sqlite_db.tbl ADD COLUMN k INTEGER;
DROP TABLE
DROP TABLE sqlite_db.tbl;
CREATE VIEW
CREATE VIEW sqlite_db.v1 AS SELECT 42;
Транзакции
CREATE TABLE sqlite_db.tmp (i INTEGER);
BEGIN; INSERT INTO sqlite_db.tmp VALUES (42); SELECT * FROM sqlite_db.tmp;
| i |
|---|
| 42 |
ROLLBACK; SELECT * FROM sqlite_db.tmp;
| i |
|---|
Устаревшая Функция
sqlite_attachустарела. Рекомендуется перейти к новойATTACHсинтаксису.
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/extensions/sqlite.html