Spec-Zone.ru › DuckDB

Расширение MySQL

Расширение mysql позволяет DuckDB напрямую читать и записывать данные из/в работающую MySQL-инстанцию. Данные можно запросить напрямую из основной MySQL-базы данных. Данные можно загрузить из MySQL-таблиц в DuckDB-таблицы или наоборот.

Установка и загрузка

Чтобы установить расширение mysql, выполните:

INSTALL mysql;

Расширение загружается автоматически при первом использовании. Если вы предпочитаете загрузить его вручную, выполните:

LOAD mysql;

Чтение данных из MySQL

Чтобы сделать базу данных MySQL доступной для DuckDB, используйте команду ATTACH с типом MYSQL или MYSQL_SCANNER.

ATTACH 'host=localhost user=root port=0 database=mysql' AS mysqldb (TYPE MYSQL);
USE mysqldb;

Настройка

Строка подключения определяет параметры подключения к MySQL в виде набора key=value пар. Любые не указанные параметры будут заменены их значениями по умолчанию, как указано в таблице ниже. Сведения о подключении также можно указать с помощью переменных окружения. Если какой-либо параметр не указан явно, расширение MySQL пытается прочитать его из переменной окружения.

Настройка Значение по умолчанию Переменная окружения
database NULL MYSQL_DATABASE
host localhost MYSQL_HOST
password MYSQL_PWD
port 0 MYSQL_TCP_PORT
socket NULL MYSQL_UNIX_PORT
user ⟨текущий пользователь⟩ MYSQL_USER
ssl_mode preferred
ssl_ca
ssl_capath
ssl_cert
ssl_cipher
ssl_crl
ssl_crlpath
ssl_key

Настройка через секреты

Сведения о подключении к MySQL также можно указать с помощью секретов. Следующий синтаксис можно использовать для создания секрета.

CREATE SECRET (
    TYPE MYSQL,
    HOST '127.0.0.1',
    PORT 0,
    DATABASE mysql,
    USER 'mysql',
    PASSWORD ''
);

Информация из секрета будет использоваться при вызове ATTACH. Мы можем оставить строку подключения пустой, чтобы использовать всю информацию, хранящуюся в секрете.

ATTACH '' AS mysql_db (TYPE MYSQL);

Мы можем использовать строку подключения для переопределения отдельных параметров. Например, чтобы подключиться к другой базе данных, сохранив при этом те же учетные данные, мы можем переопределить только имя базы данных следующим образом.

ATTACH 'database=my_other_db' AS mysql_db (TYPE MYSQL);

По умолчанию созданные секреты временные. Секреты можно сохранить с помощью команды CREATE PERSISTENT SECRET. Постоянные секреты можно использовать в разных сеансах.

Управление несколькими секретами

Имена секретов могут использоваться для управления подключениями к нескольким экземплярам баз данных MySQL. Секретам можно присвоить имя при создании.

CREATE SECRET mysql_secret_one (
    TYPE MYSQL,
    HOST '127.0.0.1',
    PORT 0,
    DATABASE mysql,
    USER 'mysql',
    PASSWORD ''
);

Затем секрет можно явно указать с помощью параметра SECRET в ATTACH.

ATTACH '' AS mysql_db_one (TYPE MYSQL, SECRET mysql_secret_one);

SSL-соединения

Параметры подключения ssl могут использоваться для создания SSL-соединений. Ниже приведено описание поддерживаемых параметров.

Настройка Описание
ssl_mode Состояние безопасности, используемое для подключения к серверу: disabled, required, verify_ca, verify_identity or preferred (по умолчанию: preferred)
ssl_ca Путь к файлу сертификата центра сертификации (CA).
ssl_capath Путь к каталогу, содержащему файлы сертификатов доверенных центров сертификации SSL.
ssl_cert Путь к файлу сертификата открытого ключа клиента.
ssl_cipher Список допустимых шифров для шифрования SSL.
ssl_crl Путь к файлу, содержащему списки отзыва сертификатов.
ssl_crlpath Путь к каталогу, содержащему файлы, содержащие списки отзыва сертификатов.
ssl_key Путь к файлу закрытого ключа клиента.

Чтение MySQL-таблиц

Таблицы в базе данных MySQL могут быть прочитаны так, как будто это обычные DuckDB-таблицы, но основанные данные читаются напрямую из MySQL во время запроса.

SHOW ALL TABLES;
name
signed_integers
SELECT * FROM signed_integers;
t s m i b
-128 -32768 -8388608 -2147483648 -9223372036854775808
127 32767 8388607 2147483647 9223372036854775807
NULL NULL NULL NULL NULL

Возможно, желательно создать копию баз данных MySQL в DuckDB, чтобы предотвратить повторное чтение таблиц из MySQL непрерывно, особенно для больших таблиц.

Данные могут быть скопированы из MySQL в DuckDB с использованием стандартных SQL-запросов, например:

CREATE TABLE duckdb_table AS FROM mysqlscanner.mysql_table;

Запись данных в MySQL

Помимо чтения данных из MySQL, создавайте таблицы, загружайте данные в MySQL и вносите другие изменения в базу данных MySQL с помощью стандартных SQL-запросов.

Это позволяет использовать DuckDB для, например, экспорта данных, хранящихся в базе данных MySQL, в Parquet или для чтения данных из файла Parquet в MySQL.

Ниже приведён краткий пример того, как создать новую таблицу в MySQL и загрузить данные в неё.

ATTACH 'host=localhost user=root port=0 database=mysqlscanner' AS mysql_db (TYPE MYSQL);
CREATE TABLE mysql_db.tbl (id INTEGER, name VARCHAR);
INSERT INTO mysql_db.tbl VALUES (42, 'DuckDB');

Поддерживается множество операций над MySQL-таблицами. Все эти операции напрямую изменяют базу данных MySQL, а результаты последующих операций затем можно прочитать с помощью MySQL. Обратите внимание, что если изменения нежелательны, ATTACH можно запустить с свойством READ_ONLY, которое предотвращает изменения в основной базе данных. Например:

ATTACH 'host=localhost user=root port=0 database=mysqlscanner' AS mysql_db (TYPE MYSQL, READ_ONLY);

Поддерживаемые операции

Ниже приведён список поддерживаемых операций.

CREATE TABLE

CREATE TABLE mysql_db.tbl (id INTEGER, name VARCHAR);

INSERT INTO

INSERT INTO mysql_db.tbl VALUES (42, 'DuckDB');

SELECT

SELECT * FROM mysql_db.tbl;
id name
42 DuckDB

COPY

COPY mysql_db.tbl TO 'data.parquet';
COPY mysql_db.tbl FROM 'data.parquet';

Вы также можете создать полную копию базы данных с помощью COPY FROM DATABASE оператора:

COPY FROM DATABASE mysql_db TO my_duckdb_db;

UPDATE

UPDATE mysql_db.tbl
SET name = 'Woohoo'
WHERE id = 42;

DELETE

DELETE FROM mysql_db.tbl
WHERE id = 42;

ALTER TABLE

ALTER TABLE mysql_db.tbl
ADD COLUMN k INTEGER;

DROP TABLE

DROP TABLE mysql_db.tbl;

CREATE VIEW

CREATE VIEW mysql_db.v1 AS SELECT 42;

CREATE SCHEMA и DROP SCHEMA

CREATE SCHEMA mysql_db.s1;
CREATE TABLE mysql_db.s1.integers (i INTEGER);
INSERT INTO mysql_db.s1.integers VALUES (42);
SELECT * FROM mysql_db.s1.integers;
i
42
DROP SCHEMA mysql_db.s1;

Транзакции

CREATE TABLE mysql_db.tmp (i INTEGER);
BEGIN;
INSERT INTO mysql_db.tmp VALUES (42);
SELECT * FROM mysql_db.tmp;

Это возвращает:

i
42
ROLLBACK;
SELECT * FROM mysql_db.tmp;

Это возвращает пустую таблицу.

DDL-операторы не являются транзакционными в MySQL.

Выполнение SQL-запросов в MySQL

Функция таблицы mysql_query

Функция таблицы mysql_query позволяет запускать произвольные запросы чтения в подключенной базе данных. mysql_query принимает имя подключенной базы данных MySQL для выполнения запроса, а также SQL-запрос для выполнения. Результат запроса возвращается. Строки с одиночными кавычками экранируются, повторяя одиночную кавычку дважды.

mysql_query(attached_database::VARCHAR, query::VARCHAR)

Например:

ATTACH 'host=localhost database=mysql' AS mysqldb (TYPE MYSQL);
SELECT * FROM mysql_query('mysqldb', 'SELECT * FROM cars LIMIT 3');

Функция mysql_execute

Функция mysql_execute позволяет запускать произвольные запросы в MySQL, включая операторы, которые обновляют схему и содержимое базы данных.

ATTACH 'host=localhost database=mysql' AS mysqldb (TYPE MYSQL);
CALL mysql_execute('mysqldb', 'CREATE TABLE my_table (i INTEGER)');

Настройки

Имя Описание Значение по умолчанию
mysql_bit1_as_boolean Преобразовывать или нет столбцы BIT(1) в BOOLEAN true
mysql_debug_show_queries НАСТРОЙКА ОТЛАДКИ: выводить все запросы к MySQL в стандартный вывод false
mysql_experimental_filter_pushdown Использовать ли фильтр pushdown (в настоящее время экспериментально) false
mysql_tinyint1_as_boolean Преобразовывать или нет столбцы TINYINT(1) в BOOLEAN true

Кэш схемы

Для избежания постоянного получения данных схемы из MySQL, DuckDB кеширует информацию о схеме — такие как имена таблиц, их столбцы и т. д. Если изменения внесены в схему через другое подключение к экземпляру MySQL, например, добавлены новые столбцы в таблицу, кэшированная информация о схеме может быть устаревшей. В этом случае можно выполнить функцию mysql_clear_cache для очистки внутренних кэшей.

CALL mysql_clear_cache();

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/extensions/mysql.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API