Расширение 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