Skip to content

Выполнение предложений в MySQL

Warning

Методы ниже читают все строки, возвращенные из БД в память драйвера Spark, и затем преобразуют их в DataFrame.

НЕ используйте их для чтения большого количества данных. Используйте DBReader или MySQL.sql вместо этого.

Как это сделать

Есть 2 способа выполнить некоторый запрос в MySQL

Использование MySQL.fetch

Используйте этот метод для выполнения некоторого SELECT запроса, который возвращает малое количество строк, например, чтение MySQL конфигурации или чтение данных из некоторой справочной таблицы. Метод возвращает Spark DataFrame.

Метод принимает MySQL.FetchOptions.

Подключение, открытый с помощью этого метода, должно быть затем закрыто с помощью connection.close() или with connection:.

Warning

Пожалуйста, учитывайте типы MySQL.

Поддержка синтаксиса в MySQL.fetch

Этот метод поддерживает любой синтаксис запроса, поддерживаемый MySQL, например:

  • ✅︎ SELECT ... FROM ...
  • ✅︎ WITH alias AS (...) SELECT ...
  • ✅︎ SELECT func(arg1, arg2) или {?= call func(arg1, arg2)} - специальный синтаксис для вызова функции
  • ✅︎ SHOW ...
  • SET ...; SELECT ...; - несколько запросов не поддерживаются

Примеры с MySQL.fetch

```python
    от onetl.connection import MySQL

    mysql = MySQL(...)

    df = mysql.fetch(
        "SELECT value FROM some.reference_table WHERE key = 'some_constant'",
        options=MySQL.FetchOptions(queryTimeout=10),
    )
    mysql.close()
    значение = df.collect()[0][0]  # получить значение из первой строки и первой колонки
```

Использование MySQL.execute

Используйте этот метод для выполнения DDL и DML операций. Каждый вызов метода выполняет операцию в отдельной транзакции и затем коммитит ее.

Метод принимает MySQL.ExecuteOptions.

Подключение, открытое с помощью этого метода, должно быть затем закрыто с помощью connection.close() или with connection:.

Поддержка синтаксиса в MySQL.execute

Этот метод поддерживает любой синтаксис запроса, поддерживаемый MySQL, например:

  • ✅︎ CREATE TABLE ..., CREATE VIEW ..., и так далее
  • ✅︎ ALTER ...
  • ✅︎ INSERT INTO ... SELECT ..., UPDATE ..., DELETE ..., и так далее
  • ✅︎ DROP TABLE ..., DROP VIEW ..., и так далее
  • ✅︎ CALL procedure(arg1, arg2) ... или {call procedure(arg1, arg2)} - специальный синтаксис для вызова процедуры
  • ✅︎ другие запросы, не упомянутые здесь
  • SET ...; SELECT ...; - несколько запросов не поддерживаются

Примеры с MySQL.execute

```python
    от onetl.connection import MySQL

    mysql = MySQL(...)

    mysql.execute("DROP TABLE schema.table")
    mysql.execute(
        """
        CREATE TABLE schema.table (
            id bigint,
            key text,
            value float
        )
        ENGINE = InnoDB
        """,
        options=MySQL.ExecuteOptions(queryTimeout=10),
    )
```

Настройки

onetl.connection.db_connection.mysql.options.MySQLFetchOptions

Bases: JDBCFetchOptions

Source code in onetl/connection/db_connection/mysql/options.py
28
29
class MySQLFetchOptions(JDBCFetchOptions):
    __doc__ = JDBCFetchOptions.__doc__.replace("SomeDB", "MySQL")  # type: ignore[assignment, union-attr]

__doc__ = JDBCFetchOptions.__doc__.replace('SomeDB', 'MySQL') class-attribute instance-attribute

onetl.connection.db_connection.mysql.options.MySQLExecuteOptions

Bases: JDBCExecuteOptions

Source code in onetl/connection/db_connection/mysql/options.py
32
33
class MySQLExecuteOptions(JDBCExecuteOptions):
    __doc__ = JDBCExecuteOptions.__doc__.replace("SomeDB", "MySQL")  # type: ignore[assignment, union-attr]

__doc__ = JDBCExecuteOptions.__doc__.replace('SomeDB', 'MySQL') class-attribute instance-attribute