MySQL и MariaDB

Support for the MySQL / MariaDB database.

The following table summarizes current support levels for database release versions.

Поддерживаемые версии MySQL / MariaDB.

Support type

Versions

Fully tested in CI

5.6, 5.7, 8.0 / 10.4, 10.5

Normal support

5.6+ / 10+

Best effort

5.0.2+ / 5.0.2+

DBAPI Support

The following dialect/DBAPI options are available. Please refer to individual DBAPI sections for connect information.

Поддерживаемые версии и функции

SQLAlchemy поддерживает MySQL, начиная с версии 5.0.2 и до современных релизов, а также все современные версии MariaDB. Подробную информацию о возможностях, поддерживаемых в том или ином выпуске сервера, можно найти в официальной документации MySQL.

Изменено в версии 1.4: минимальная поддерживаемая версия MySQL теперь 5.0.2.

Поддержка MariaDB

Вариант MariaDB для MySQL сохраняет фундаментальную совместимость с протоколами MySQL, однако развитие этих двух продуктов продолжает расходиться. В области SQLAlchemy эти две базы данных имеют небольшое количество синтаксических и поведенческих различий, которые SQLAlchemy учитывает автоматически. Для подключения к базе данных MariaDB не требуется вносить изменения в URL базы данных:

engine = create_engine("mysql+pymysql://user:pass@some_mariadb/dbname?charset=utf8mb4")

При первом подключении диалект SQLAlchemy использует схему определения версии сервера, которая определяет, является ли база данных резервной копии MariaDB. Основываясь на этом флаге, диалект может сделать другой выбор в тех областях, где его поведение должно быть другим.

Режим только для MariaDB

Диалект также поддерживает опциональный режим подключения «только MariaDB», который может быть полезен в случае, когда приложение использует специфические возможности MariaDB и не совместимо с базой данных MySQL. Чтобы использовать этот режим работы, замените маркер «mysql» в приведенном выше URL на «mariadb»:

engine = create_engine("mariadb+pymysql://user:pass@some_mariadb/dbname?charset=utf8mb4")

Вышеупомянутый механизм при первом подключении выдаст ошибку, если при определении версии сервера обнаружится, что базой данных резервного копирования является не MariaDB.

При использовании движка с "mariadb" в качестве имени диалекта, все специфичные для mysql опции, включающие в себя имя «mysql», теперь называются «mariadb «. Это означает, что опции типа mysql_engine должны быть названы mariadb_engine и т.д. Опции «mysql» и «mariadb» могут использоваться одновременно для приложений, использующих URL с диалектами «mysql» и «mariadb»:

my_table = Table(
    "mytable",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("textdata", String(50)),
    mariadb_engine="InnoDB",
    mysql_engine="InnoDB",
)

Index(
    "textdata_ix",
    my_table.c.textdata,
    mysql_prefix="FULLTEXT",
    mariadb_prefix="FULLTEXT",
)

Аналогичное поведение будет иметь место при отражении вышеуказанных структур, т.е. префикс «mariadb» будет присутствовать в именах опций, когда URL базы данных основан на имени «mariadb».

Добавлено в версии 1.4: Добавлено имя диалекта «mariadb», поддерживающее «режим только для MariaDB» для диалекта MySQL.

Таймауты и разрывы соединения

MySQL / MariaDB поддерживают автоматическое закрытие соединения для соединений, которые простаивали в течение фиксированного периода времени, по умолчанию равного восьми часам. Чтобы обойти эту проблему, используйте опцию create_engine.pool_recycle, которая гарантирует, что соединение будет отменено и заменено новым, если оно присутствует в пуле в течение фиксированного количества секунд:

engine = create_engine('mysql+mysqldb://...', pool_recycle=3600)

Для более полного обнаружения разъединения объединенных соединений, включая учет перезагрузки сервера и сетевых проблем, может быть использован подход предварительного пинга. См. раздел Работа с разъединениями о современных подходах.

См.также

Работа с разъединениями - Справочная информация о нескольких методах работы с соединениями, прерванными по таймеру, а также с перезагрузками баз данных.

Аргументы CREATE TABLE, включая механизмы хранения данных

Синтаксис CREATE TABLE в MySQL и MariaDB включает широкий набор специальных опций, включая ENGINE, CHARSET, MAX_ROWS, ROW_FORMAT, INSERT_METHOD и многие другие. Для того чтобы учесть отображение этих аргументов, укажите форму mysql_argument_name="value". Например, чтобы задать таблицу с ENGINE из InnoDB, CHARSET из utf8mb4 и KEY_BLOCK_SIZE из 1024:

Table('mytable', metadata,
      Column('data', String(32)),
      mysql_engine='InnoDB',
      mysql_charset='utf8mb4',
      mysql_key_block_size="1024"
     )

При поддержке режима Режим только для MariaDB необходимо также включить аналогичные ключи с префиксом «mariadb». Значения, конечно, могут варьироваться независимо друг от друга, чтобы можно было поддерживать разные настройки MySQL и MariaDB:

# support both "mysql" and "mariadb-only" engine URLs

Table('mytable', metadata,
      Column('data', String(32)),

      mysql_engine='InnoDB',
      mariadb_engine='InnoDB',

      mysql_charset='utf8mb4',
      mariadb_charset='utf8',

      mysql_key_block_size="1024"
      mariadb_key_block_size="1024"

     )

Диалекты MySQL / MariaDB обычно передают любое ключевое слово, указанное как mysql_keyword_name, как KEYWORD_NAME в операторе CREATE TABLE. Некоторые из этих имен будут отображаться с пробелом вместо символа подчеркивания; для поддержки этого диалект MySQL осведомлен об этих конкретных именах, которые включают DATA DIRECTORY (например, mysql_data_directory), CHARACTER SET (например, mysql_character_set) и INDEX DIRECTORY (например, mysql_index_directory).

Наиболее распространенным аргументом является mysql_engine, который относится к механизму хранения таблицы. Исторически сложилось так, что при установке сервера MySQL по умолчанию используется значение MyISAM, хотя в более новых версиях по умолчанию может использоваться значение InnoDB. Движок InnoDB обычно предпочтительнее из-за его поддержки транзакций и внешних ключей.

Таблица Table, созданная в базе данных MySQL / MariaDB с механизмом хранения MyISAM, будет по существу нетранзакционной, то есть любой оператор INSERT/UPDATE/DELETE, ссылающийся на эту таблицу, будет вызываться как autocommit. В ней также не будет поддержки ограничений внешнего ключа; хотя оператор CREATE TABLE принимает опции внешнего ключа, при использовании механизма хранения MyISAM эти аргументы отбрасываются. Отражение такой таблицы также не даст информации об ограничениях внешнего ключа.

Для полностью атомарных транзакций, а также поддержки ограничений внешнего ключа, все участвующие утверждения CREATE TABLE должны указывать транзакционный механизм, которым в подавляющем большинстве случаев является InnoDB.

Чувствительность к случаю и отражение в таблице

И MySQL, и MariaDB имеют непоследовательную поддержку имен идентификаторов, чувствительных к регистру, основываясь на специфических деталях базовой операционной системы. Тем не менее, было замечено, что независимо от того, какое поведение чувствительности к регистру присутствует, имена таблиц в объявлениях внешних ключей всегда получаются из базы данных в нижнем регистре, что делает невозможным точное отражение схемы, в которой взаимосвязанные таблицы используют имена идентификаторов в смешанном регистре.

Поэтому настоятельно рекомендуется объявлять имена таблиц в нижнем регистре как в SQLAlchemy, так и в самой базе данных MySQL / MariaDB, особенно если планируется использовать функции отражения базы данных.

Уровень изоляции транзакций

Все диалекты MySQL / MariaDB поддерживают установку уровня изоляции транзакций как через специфичный для диалекта параметр create_engine.isolation_level, принимаемый командой create_engine(), так и через аргумент Connection.execution_options.isolation_level, передаваемый команде Connection.execution_options(). Эта функция работает путем выдачи команды SET SESSION TRANSACTION ISOLATION LEVEL <level> для каждого нового соединения. Для специального уровня изоляции AUTOCOMMIT используются методы, специфичные для DBAPI.

Чтобы установить уровень изоляции с помощью create_engine():

engine = create_engine(
                "mysql+mysqldb://scott:tiger@localhost/test",
                isolation_level="READ UNCOMMITTED"
            )

Чтобы задать параметры выполнения по каждому соединению, выполните следующие действия:

connection = engine.connect()
connection = connection.execution_options(
    isolation_level="READ COMMITTED"
)

Допустимые значения для isolation_level включают:

  • READ COMMITTED

  • READ UNCOMMITTED

  • REPEATABLE READ

  • SERIALIZABLE

  • AUTOCOMMIT

Специальное значение AUTOCOMMIT использует различные атрибуты «autocommit», предоставляемые конкретными DBAPI, и в настоящее время поддерживается MySQLdb, MySQL-Client, MySQL-Connector Python и PyMySQL. При его использовании соединение с базой данных будет возвращать true для значения SELECT @@autocommit;.

Существует также больше вариантов конфигураций уровня изоляции, например, объекты «sub-engine», связанные с основным Engine, в каждом из которых применяются различные настройки уровня изоляции. См. обсуждение в Установка уровней изоляции транзакций, включая DBAPI Autocommit для справки.

Поведение AUTO_INCREMENT

При создании таблиц SQLAlchemy автоматически устанавливает AUTO_INCREMENT на первый Integer столбец первичного ключа, который не помечен как внешний ключ:

>>> t = Table('mytable', metadata,
...   Column('mytable_id', Integer, primary_key=True)
... )
>>> t.create()
CREATE TABLE mytable (
        id INTEGER NOT NULL AUTO_INCREMENT,
        PRIMARY KEY (id)
)

Вы можете отключить это поведение, передав False в аргумент Column.autoincrement в Column. Этот флаг также можно использовать для включения автоинкремента на вторичный столбец в многостолбцовом ключе для некоторых систем хранения:

Table('mytable', metadata,
      Column('gid', Integer, primary_key=True, autoincrement=False),
      Column('id', Integer, primary_key=True)
     )

Курсоры на стороне сервера

Поддержка курсора на стороне сервера доступна для диалектов mysqlclient, PyMySQL, mariadbconnector и может быть доступна в других. Для этого используется либо флаг «buffered=True/False», если он доступен, либо внутренний класс MySQLdb.cursors.SSCursor или pymysql.cursors.SSCursor.

Курсоры на стороне сервера включаются на основе каждого запроса с помощью опции выполнения соединения Connection.execution_options.stream_results:

with engine.connect() as conn:
    result = conn.execution_options(stream_results=True).execute(text("select * from table"))

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

Не рекомендуется, начиная с версии 1.4: Флаг server_side_cursors на уровне диалекта устарел и будет удален в одном из будущих выпусков. Для поддержки небуферизованных курсоров используйте опцию выполнения Connection.stream_results.

Юникод

Выбор набора символов

Большинство MySQL / MariaDB DBAPI предлагают возможность установить набор символов клиента для соединения. Обычно для этого используется параметр charset в URL, например:

e = create_engine(
    "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4")

Этот набор символов является набором символов клиента для соединения. Некоторые MySQL DBAPI по умолчанию используют значение latin1, а некоторые используют установку default-character-set в файле my.cnf. Для уточнения поведения следует обратиться к документации по используемому DBAPI.

Традиционно для Юникода используется кодировка 'utf8'. Однако в версиях MySQL 5.5.3 и MariaDB 5.5 и далее была введена новая специфическая для MySQL кодировка 'utf8mb4', а начиная с MySQL 8.0 сервер выдает предупреждение, если в каких-либо директивах на стороне сервера указывается обычная кодировка utf8, которая заменяется на utf8mb3. Причина появления новой кодировки заключается в том, что устаревшая кодировка MySQL utf-8 поддерживает только кодовые точки длиной до трех байт вместо четырех. Поэтому при взаимодействии с базой данных MySQL или MariaDB, содержащей кодовые точки размером более трех байт, предпочтительнее использовать новую кодировку, если она поддерживается как базой данных, так и клиентским DBAPI, как в:

e = create_engine(
    "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4")

Все современные DBAPI должны поддерживать кодовую таблицу utf8mb4.

Для того чтобы использовать кодировку utf8mb4 для схемы, которая была создана с устаревшей utf8, могут потребоваться изменения в схеме MySQL/MariaDB и/или конфигурации сервера.

См.также

The utf8mb4 Character Set - в документации MySQL

Работа с предупреждениями о двоичных данных и Unicode

MySQL версий 5.6, 5.7 и более поздних (не MariaDB на момент написания этой статьи) теперь выдает предупреждение при попытке передать двоичные данные в базу данных при наличии кодировки набора символов, когда сами двоичные данные не являются допустимыми для этой кодировки:

default.py:509: Warning: (1300, "Invalid utf8mb4 character string:
'F9876A'")
  cursor.execute(statement, parameters)

Это предупреждение связано с тем, что клиентская библиотека MySQL пытается интерпретировать двоичную строку как объект юникода, даже если используется тип данных LargeBinary. Чтобы решить эту проблему, оператор SQL требует, чтобы перед любым не-NULL значением присутствовал двоичный «интродуктор набора символов», который отображается следующим образом:

INSERT INTO table (data) VALUES (_binary %s)

Эти вводные символьные наборы предоставляются драйвером DBAPI, предполагающим использование mysqlclient или PyMySQL (оба рекомендуются). Добавьте параметр строки запроса binary_prefix=true в URL, чтобы устранить это предупреждение:

# mysqlclient
engine = create_engine(
    "mysql+mysqldb://scott:tiger@localhost/test?charset=utf8mb4&binary_prefix=true")

# PyMySQL
engine = create_engine(
    "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4&binary_prefix=true")

Флаг binary_prefix может поддерживаться или не поддерживаться другими драйверами MySQL.

Сам SQLAlchemy не может надежно рендерить этот префикс _binary, поскольку он не работает со значением NULL, которое допустимо передавать в качестве связанного параметра. Поскольку драйвер MySQL отображает параметры непосредственно в строку SQL, это наиболее эффективное место для передачи этого дополнительного ключевого слова.

См.также

Character set introducers - на сайте MySQL

Стиль цитирования ANSI

MySQL / MariaDB имеют две разновидности идентификатора «стиль цитирования», один из которых использует обратные знаки, а другой - кавычки, например, `some_identifier` vs. "some_identifier". All MySQL dialects detect which version is in use by checking the value of sql_mode when a connection is first established with a particular Engine. Этот стиль цитирования используется при отображении имен таблиц и столбцов, а также при отражении существующих структур баз данных. Определение происходит полностью автоматически, и для использования того или иного стиля цитирования не требуется никакой специальной настройки.

Изменение режима sql_mode

MySQL поддерживает работу в нескольких Server SQL Modes как для серверов, так и для клиентов. Чтобы изменить sql_mode для конкретного приложения, разработчик может использовать систему событий SQLAlchemy.

В следующем примере система событий используется для установки sql_mode на события first_connect и connect:

from sqlalchemy import create_engine, event

eng = create_engine("mysql+mysqldb://scott:tiger@localhost/test", echo='debug')

# `insert=True` will ensure this is the very first listener to run
@event.listens_for(eng, "connect", insert=True)
def connect(dbapi_connection, connection_record):
    cursor = dbapi_connection.cursor()
    cursor.execute("SET sql_mode = 'STRICT_ALL_TABLES'")

conn = eng.connect()

В примере, показанном выше, событие «connect» вызовет оператор «SET» на соединении в тот момент, когда конкретное соединение DBAPI впервые создается для данного пула, до того, как соединение станет доступным для пула соединений. Кроме того, поскольку функция была зарегистрирована в insert=True, она будет добавлена во внутренний список зарегистрированных функций.

MySQL / MariaDB SQL Extensions

Многие из расширений MySQL / MariaDB SQL обрабатываются через поддержку общих функций и операторов SQLAlchemy:

table.select(table.c.password==func.md5('plaintext'))
table.select(table.c.username.op('regexp')('^[a-d]'))

И, конечно же, любой правильный оператор SQL может быть выполнен как строка.

В настоящее время доступна ограниченная прямая поддержка расширений MySQL / MariaDB для SQL.

  • INSERT…ON DUPLICATE KEY UPDATE: См. INSERT…ON DUPLICATE KEY UPDATE (Upsert).

  • SELECT pragma, используйте Select.prefix_with() и Query.prefix_with():

    select(...).prefix_with(['HIGH_PRIORITY', 'SQL_SMALL_RESULT'])
  • UPDATE с LIMIT:

    update(..., mysql_limit=10, mariadb_limit=10)
  • подсказки оптимизатора, используйте Select.prefix_with() и Query.prefix_with():

    select(...).prefix_with("/*+ NO_RANGE_OPTIMIZATION(t4 PRIMARY) */")
  • подсказки индекса, используйте Select.with_hint() и Query.with_hint():

    select(...).with_hint(some_table, "USE INDEX xyz")
  • Поддержка оператора MATCH:

    from sqlalchemy.dialects.mysql import match
    select(...).where(match(col1, col2, against="some expr").in_boolean_mode())
    
    .. seealso::
    
        :class:`_mysql.match`

ВСТАВКА/УДАЛЕНИЕ… ВОЗВРАЩЕНИЕ

Диалект MariaDB поддерживает синтаксисы INSERT..RETURNING и DELETE..RETURNING (10.0+) в версии 10.5+. В некоторых случаях INSERT..RETURNING может использоваться автоматически для получения вновь сгенерированных идентификаторов вместо традиционного подхода использования cursor.lastrowid, однако cursor.lastrowid в настоящее время все еще предпочтительнее для простых случаев с одним выражением из-за его лучшей производительности.

Чтобы указать явное предложение RETURNING, используйте метод _UpdateBase.returning() на основе каждого предложения:

# INSERT..RETURNING
result = connection.execute(
    table.insert().
    values(name='foo').
    returning(table.c.col1, table.c.col2)
)
print(result.all())

# DELETE..RETURNING
result = connection.execute(
    table.delete().
    where(table.c.name=='foo').
    returning(table.c.col1, table.c.col2)
)
print(result.all())

Добавлено в версии 2.0: Добавлена поддержка для MariaDB RETURNING

INSERT…ON DUPLICATE KEY UPDATE (Upsert)

MySQL / MariaDB допускают «апсерт» (обновление или вставку) строк в таблицу через предложение ON DUPLICATE KEY UPDATE в операторе INSERT. Строка-кандидат будет вставлена, только если она не совпадает с существующим первичным или уникальным ключом в таблице; в противном случае будет выполнено UPDATE. Оператор позволяет отдельно указывать значения для INSERT и значения для UPDATE.

SQLAlchemy обеспечивает поддержку ON DUPLICATE KEY UPDATE через специфическую для MySQL функцию insert(), которая предоставляет генеративный метод Insert.on_duplicate_key_update():

>>> from sqlalchemy.dialects.mysql import insert

>>> insert_stmt = insert(my_table).values(
...     id='some_existing_id',
...     data='inserted value')

>>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
...     data=insert_stmt.inserted.data,
...     status='U'
... )
>>> print(on_duplicate_key_stmt)
{printsql}INSERT INTO my_table (id, data) VALUES (%s, %s)
ON DUPLICATE KEY UPDATE data = VALUES(data), status = %s

В отличие от фразы PostgreSQL «ON CONFLICT», фраза «ON DUPLICATE KEY UPDATE» всегда будет соответствовать любому первичному или уникальному ключу, и всегда будет выполнять UPDATE, если есть совпадение; нет никаких вариантов, чтобы она выдавала ошибку или пропускала выполнение UPDATE.

ON DUPLICATE KEY UPDATE используется для выполнения обновления уже существующей строки, используя любую комбинацию новых значений, а также значений из предлагаемой вставки. Эти значения обычно задаются с помощью аргументов ключевых слов, передаваемых в Insert.on_duplicate_key_update() с указанием значений ключей столбцов (обычно имя столбца, если не указано Column.key ) в качестве ключей и литералов или выражений SQL в качестве значений:

>>> insert_stmt = insert(my_table).values(
...          id='some_existing_id',
...          data='inserted value')

>>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
...     data="some data",
...     updated_at=func.current_timestamp(),
... )

>>> print(on_duplicate_key_stmt)
{printsql}INSERT INTO my_table (id, data) VALUES (%s, %s)
ON DUPLICATE KEY UPDATE data = %s, updated_at = CURRENT_TIMESTAMP

По аналогии с UpdateBase.values(), принимаются другие формы параметров, включая единственный словарь:

>>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
...     {"data": "some data", "updated_at": func.current_timestamp()},
... )

а также список 2-кортежей, который автоматически предоставит упорядоченный по параметрам оператор UPDATE способом, аналогичным описанному в Упорядоченные по параметрам обновления. В отличие от объекта Update, здесь не требуется специального флага для указания намерения, поскольку форма аргумента в данном контексте однозначна:

>>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
...     [
...         ("data", "some data"),
...         ("updated_at", func.current_timestamp()),
...     ]
... )

>>> print(on_duplicate_key_stmt)
{printsql}INSERT INTO my_table (id, data) VALUES (%s, %s)
ON DUPLICATE KEY UPDATE data = %s, updated_at = CURRENT_TIMESTAMP

Изменено в версии 1.3: поддержка пункта UPDATE с параметрами в MySQL ON DUPLICATE KEY UPDATE

Предупреждение

Метод Insert.on_duplicate_key_update() не принимает во внимание значения UPDATE по умолчанию на стороне Python или функции генерации, например, указанные с помощью Column.onupdate. Эти значения не будут использоваться для UPDATE в стиле ON DUPLICATE KEY, если они не указаны вручную явно в параметрах.

Для того чтобы ссылаться на предлагаемую строку вставки, специальный псевдоним Insert.inserted доступен в качестве атрибута на объекте Insert; этот объект является ColumnCollection, который содержит все столбцы целевой таблицы:

>>> stmt = insert(my_table).values(
...     id='some_id',
...     data='inserted value',
...     author='jlh')

>>> do_update_stmt = stmt.on_duplicate_key_update(
...     data="updated value",
...     author=stmt.inserted.author
... )

>>> print(do_update_stmt)
{printsql}INSERT INTO my_table (id, data, author) VALUES (%s, %s, %s)
ON DUPLICATE KEY UPDATE data = %s, author = VALUES(author)

При отображении пространство имен «inserted» будет выдавать выражение VALUES(<columnname>).

Добавлено в версии 1.2: Добавлена поддержка предложения MySQL ON DUPLICATE KEY UPDATE

rowcount Поддержка

SQLAlchemy стандартизирует атрибут DBAPI cursor.rowcount для обычного определения «количество строк, сопоставленных с оператором UPDATE или DELETE». Это противоречит настройке по умолчанию большинства драйверов MySQL DBAPI, которая представляет собой «количество рядов, фактически измененных/удаленных». По этой причине диалекты SQLAlchemy MySQL всегда добавляют флаг constants.CLIENT.FOUND_ROWS или любой другой, эквивалентный для целевого диалекта, при подключении. В настоящее время эта настройка жестко закодирована.

См.также

CursorResult.rowcount

MySQL / MariaDB - специфические параметры индекса

Существуют специфические для MySQL и MariaDB расширения конструкции Index.

Длина индекса

MySQL и MariaDB предоставляют возможность создавать индексные записи определенной длины, где «длина» означает количество символов или байтов в каждом значении, которое станет частью индекса. SQLAlchemy предоставляет эту возможность через параметры mysql_length и/или mariadb_length:

Index('my_index', my_table.c.data, mysql_length=10, mariadb_length=10)

Index('a_b_idx', my_table.c.a, my_table.c.b, mysql_length={'a': 4,
                                                           'b': 9})

Index('a_b_idx', my_table.c.a, my_table.c.b, mariadb_length={'a': 4,
                                                           'b': 9})

Длина префикса задается в символах для недвоичных типов строк и в байтах для двоичных типов строк. Значение, передаваемое в аргументе keyword должно быть либо целым числом (и, таким образом, указывать одно и то же значение длины префикса для всех столбцов индекса), либо диктой, в которой ключи - это имена столбцов, а значения - значения длины префикса для соответствующих столбцов. MySQL и MariaDB разрешают указывать длину для столбца индекса только в том случае, если это столбец CHAR, VARCHAR, TEXT, BINARY, VARBINARY и BLOB.

Префиксы индексов

Хранилища MySQL позволяют указывать префикс индекса при создании индекса. SQLAlchemy предоставляет эту возможность через параметр mysql_prefix на Index:

Index('my_index', my_table.c.data, mysql_prefix='FULLTEXT')

Значение, переданное в аргументе keyword, будет просто передано в основной CREATE INDEX, поэтому оно должно быть действительным префиксом индекса для вашего механизма хранения MySQL.

См.также

CREATE INDEX - Документация по MySQL

Типы индексов

Некоторые движки хранения MySQL позволяют указывать тип индекса при создании индекса или ограничения первичного ключа. SQLAlchemy предоставляет такую возможность через параметр mysql_using на Index:

Index('my_index', my_table.c.data, mysql_using='hash', mariadb_using='hash')

А также параметр mysql_using на PrimaryKeyConstraint:

PrimaryKeyConstraint("data", mysql_using='hash', mariadb_using='hash')

Значение, переданное в аргументе keyword, будет просто передано в соответствующее предложение CREATE INDEX или PRIMARY KEY, поэтому оно должно быть действительным типом индекса для вашего механизма хранения MySQL.

Более подробную информацию можно найти на сайте:

https://dev.mysql.com/doc/refman/5.0/en/create-index.html

https://dev.mysql.com/doc/refman/5.0/en/create-table.html

Парсеры индексов

CREATE FULLTEXT INDEX в MySQL также поддерживает опцию «WITH PARSER». Она доступна с помощью аргумента ключевого слова mysql_with_parser:

Index(
    'my_index', my_table.c.data,
    mysql_prefix='FULLTEXT', mysql_with_parser="ngram",
    mariadb_prefix='FULLTEXT', mariadb_with_parser="ngram",
)

Добавлено в версии 1.3.

Внешние ключи MySQL / MariaDB

Поведение MySQL и MariaDB в отношении внешних ключей имеет несколько важных оговорок.

Ключевые иностранные аргументы, которых следует избегать

Ни MySQL, ни MariaDB не поддерживают аргументы внешнего ключа «DEFERRABLE», «INITIALLY» или «MATCH». Использование ключевого аргумента deferrable или initially с ForeignKeyConstraint или ForeignKey приведет к тому, что эти ключевые слова будут отображены в выражении DDL, что приведет к ошибке в MySQL или MariaDB. Для того чтобы использовать эти ключевые слова во внешнем ключе и при этом игнорировать их на бэкенде MySQL / MariaDB, используйте пользовательское правило компиляции:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.schema import ForeignKeyConstraint

@compiles(ForeignKeyConstraint, "mysql", "mariadb")
def process(element, compiler, **kw):
    element.deferrable = element.initially = None
    return compiler.visit_foreign_key_constraint(element, **kw)

Ключевое слово «MATCH» на самом деле более коварно, и оно явно запрещено SQLAlchemy в сочетании с бэкендами MySQL или MariaDB. Этот аргумент молча игнорируется MySQL / MariaDB, но в дополнение к этому имеет эффект того, что опции ON UPDATE и ON DELETE также игнорируются бэкендом. Поэтому MATCH никогда не следует использовать с бэкендами MySQL / MariaDB; как и в случае с DEFERRABLE и INITIALLY, для исправления ForeignKeyConstraint во время определения DDL можно использовать пользовательские правила компиляции.

Отражение ограничений внешнего ключа

Не все движки хранения MySQL / MariaDB поддерживают внешние ключи. При использовании очень распространенного движка хранения данных MySQL MyISAM информация, загружаемая при отражении таблицы, не будет включать внешние ключи. Для таких таблиц вы можете указать ForeignKeyConstraint во время отражения:

Table('mytable', metadata,
      ForeignKeyConstraint(['other_id'], ['othertable.other_id']),
      autoload_with=engine
     )

MySQL / MariaDB Уникальные ограничения и отражение

SQLAlchemy поддерживает как конструкцию Index с флагом unique=True, обозначающую индекс UNIQUE, так и конструкцию UniqueConstraint, представляющую ограничение UNIQUE. Оба объекта/синтаксиса поддерживаются MySQL / MariaDB при создании DDL для создания этих ограничений. Однако в MySQL / MariaDB нет конструкции уникального ограничения, отдельной от уникального индекса; то есть, ограничение «UNIQUE» в MySQL / MariaDB эквивалентно созданию «UNIQUE INDEX».

При отражении этих конструкций методы Inspector.get_indexes() и Inspector.get_unique_constraints() будут ** оба** возвращать запись для индекса UNIQUE в MySQL / MariaDB. Однако, при выполнении полного отражения таблицы с помощью Table(..., autoload_with=engine), конструкция UniqueConstraint ни при каких обстоятельствах не является **** частью полностью отраженной конструкции Table; эта конструкция всегда представлена Index с параметром unique=True, присутствующим в коллекции Table.indexes.

Вопросы TIMESTAMP / DATETIME

Рендеринг ON UPDATE CURRENT TIMESTAMP для MySQL / MariaDB’s explicit_defaults_for_timestamp

MySQL / MariaDB исторически расширили DDL для типа данных TIMESTAMP в фразу «TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP», которая включает нестандартный SQL, который автоматически обновляет столбец текущей временной меткой, когда происходит UPDATE, устраняя обычную необходимость использования триггера в таком случае, когда изменения обновления желательны на стороне сервера.

В MySQL 5.6 появился новый флаг explicit_defaults_for_timestamp, который отключает вышеописанное поведение, а в MySQL 8 этот флаг по умолчанию равен true, что означает, что для получения временной метки MySQL «on update timestamp» без изменения этого флага, вышеприведенный DDL должен быть отображен явно. Кроме того, этот же DDL действителен и для использования типа данных DATETIME.

Диалект MySQL в SQLAlchemy пока не имеет возможности генерировать предложение MySQL «ON UPDATE CURRENT_TIMESTAMP», отмечая, что это не «ON UPDATE» общего назначения, поскольку в стандартном SQL нет такого синтаксиса. Параметр SQLAlchemy Column.server_onupdate в настоящее время не связан с этим специальным поведением MySQL.

Чтобы сгенерировать этот DDL, используйте параметр Column.server_default и передайте текстовое предложение, которое также включает предложение ON UPDATE:

from sqlalchemy import Table, MetaData, Column, Integer, String, TIMESTAMP
from sqlalchemy import text

metadata = MetaData()

mytable = Table(
    "mytable",
    metadata,
    Column('id', Integer, primary_key=True),
    Column('data', String(50)),
    Column(
        'last_updated',
        TIMESTAMP,
        server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    )
)

Те же инструкции относятся к использованию типов данных DateTime и DATETIME:

from sqlalchemy import DateTime

mytable = Table(
    "mytable",
    metadata,
    Column('id', Integer, primary_key=True),
    Column('data', String(50)),
    Column(
        'last_updated',
        DateTime,
        server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    )
)

Даже если функция Column.server_onupdate не генерирует этот DDL, все равно может быть желательно сигнализировать ORM, что это обновленное значение должно быть извлечено. Этот синтаксис выглядит следующим образом:

from sqlalchemy.schema import FetchedValue

class MyClass(Base):
    __tablename__ = 'mytable'

    id = Column(Integer, primary_key=True)
    data = Column(String(50))
    last_updated = Column(
        TIMESTAMP,
        server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"),
        server_onupdate=FetchedValue()
    )

Колонки TIMESTAMP и NULL

MySQL исторически сложилось так, что столбец, указывающий тип данных TIMESTAMP, неявно включает значение по умолчанию CURRENT_TIMESTAMP, даже если это не указано, и дополнительно устанавливает столбец как NOT NULL, что противоположно поведению всех других типов данных:

mysql> CREATE TABLE ts_test (
    -> a INTEGER,
    -> b INTEGER NOT NULL,
    -> c TIMESTAMP,
    -> d TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    -> e TIMESTAMP NULL);
Query OK, 0 rows affected (0.03 sec)

mysql> SHOW CREATE TABLE ts_test;
+---------+-----------------------------------------------------
| Table   | Create Table
+---------+-----------------------------------------------------
| ts_test | CREATE TABLE `ts_test` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) NOT NULL,
  `c` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `e` timestamp NULL DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Выше мы видим, что столбец INTEGER по умолчанию имеет значение NULL, если он не указан с NOT NULL. Но когда столбец имеет тип TIMESTAMP, генерируется неявное значение по умолчанию CURRENT_TIMESTAMP, которое также заставляет столбец быть NOT NULL, даже если мы не указывали его как таковой.

Это поведение MySQL может быть изменено на стороне MySQL с помощью флага конфигурации explicit_defaults_for_timestamp, введенного в MySQL 5.6. При включении этой настройки сервера столбцы TIMESTAMP ведут себя как любой другой тип данных на стороне MySQL в отношении значений по умолчанию и возможности обнуления.

Однако, чтобы удовлетворить подавляющее большинство баз данных MySQL, которые не указывают этот новый флаг, SQLAlchemy явно выдает спецификатор «NULL» для любого столбца TIMESTAMP, который не указывает nullable=False. Для того, чтобы приспособиться к новым базам данных, которые указывают explicit_defaults_for_timestamp, SQLAlchemy также выдает NOT NULL для столбцов TIMESTAMP, которые указывают nullable=False. Следующий пример иллюстрирует:

from sqlalchemy import MetaData, Integer, Table, Column, text
from sqlalchemy.dialects.mysql import TIMESTAMP

m = MetaData()
t = Table('ts_test', m,
        Column('a', Integer),
        Column('b', Integer, nullable=False),
        Column('c', TIMESTAMP),
        Column('d', TIMESTAMP, nullable=False)
    )


from sqlalchemy import create_engine
e = create_engine("mysql+mysqldb://scott:tiger@localhost/test", echo=True)
m.create_all(e)

выход:

CREATE TABLE ts_test (
    a INTEGER,
    b INTEGER NOT NULL,
    c TIMESTAMP NULL,
    d TIMESTAMP NOT NULL
)

SQL-конструкции MySQL

Object Name Description

match

Произведите предложение MATCH (X, Y) AGAINST ('TEXT').

class sqlalchemy.dialects.mysql.match

Произведите предложение MATCH (X, Y) AGAINST ('TEXT').

Например:

from sqlalchemy import desc
from sqlalchemy.dialects.mysql import match

match_expr = match(
    users_table.c.firstname,
    users_table.c.lastname,
    against="Firstname Lastname",
)

stmt = (
    select(users_table)
    .where(match_expr.in_boolean_mode())
    .order_by(desc(match_expr))
)

Выдаст SQL, похожий на:

SELECT id, firstname, lastname
FROM user
WHERE MATCH(firstname, lastname) AGAINST (:param_1 IN BOOLEAN MODE)
ORDER BY MATCH(firstname, lastname) AGAINST (:param_2) DESC

Функция match() является автономной версией метода ColumnElement.match(), доступной для всех выражений SQL, как при использовании ColumnElement.match(), но позволяет передавать несколько столбцов

Параметры:
  • cols – выражения столбцов для сопоставления

  • against – выражение, которое можно сравнить с

  • in_boolean_mode – булево, установить «режим булево» в true

  • in_natural_language_mode – булево, установить «естественный язык» в значение true

  • with_query_expansion – boolean, установить «расширение запроса» в true

Добавлено в версии 1.4.19.

См.также

ColumnElement.match()

Классная подпись

класс sqlalchemy.dialects.mysql.match (sqlalchemy.sql.expression.Generative, sqlalchemy.sql.expression.BinaryExpression)

method sqlalchemy.dialects.mysql.match.in_boolean_mode() Self

Примените модификатор «IN BOOLEAN MODE» к выражению MATCH.

Результат:

новый экземпляр match с внесенными изменениями.

method sqlalchemy.dialects.mysql.match.in_natural_language_mode() Self

Примените модификатор «IN NATURAL LANGUAGE MODE» к выражению MATCH.

Результат:

новый экземпляр match с внесенными изменениями.

attribute sqlalchemy.dialects.mysql.match.inherit_cache: Optional[bool] = True

Укажите, должен ли данный экземпляр HasCacheKey использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.

По умолчанию атрибут имеет значение None, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значения False, за исключением того, что при этом выдается предупреждение.

Этот флаг может быть установлен в True на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.

См.также

Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута HasCacheKey.inherit_cache для сторонних или определенных пользователем конструкций SQL.

method sqlalchemy.dialects.mysql.match.with_query_expansion() Self

Примените модификатор «WITH QUERY EXPANSION» к выражению MATCH.

Результат:

новый экземпляр match с внесенными изменениями.

Типы данных MySQL

Как и во всех диалектах SQLAlchemy, все типы UPPERCASE, которые, как известно, действительны в MySQL, импортируются из диалекта верхнего уровня:

from sqlalchemy.dialects.mysql import (
    BIGINT,
    BINARY,
    BIT,
    BLOB,
    BOOLEAN,
    CHAR,
    DATE,
    DATETIME,
    DECIMAL,
    DECIMAL,
    DOUBLE,
    ENUM,
    FLOAT,
    INTEGER,
    LONGBLOB,
    LONGTEXT,
    MEDIUMBLOB,
    MEDIUMINT,
    MEDIUMTEXT,
    NCHAR,
    NUMERIC,
    NVARCHAR,
    REAL,
    SET,
    SMALLINT,
    TEXT,
    TIME,
    TIMESTAMP,
    TINYBLOB,
    TINYINT,
    TINYTEXT,
    VARBINARY,
    VARCHAR,
    YEAR,
)

Типы, которые специфичны для MySQL или имеют специфичные для MySQL аргументы построения, следующие:

Object Name Description

BIGINT

Тип MySQL BIGINTEGER.

BIT

MySQL Тип BIT.

CHAR

Тип MySQL CHAR, для символьных данных фиксированной длины.

DATETIME

Тип MySQL DATETIME.

DECIMAL

Тип MySQL DECIMAL.

ENUM

Тип MySQL ENUM.

FLOAT

MySQL Тип FLOAT.

INTEGER

MySQL Тип INTEGER.

JSON

Тип MySQL JSON.

LONGBLOB

Тип MySQL LONGBLOB, для двоичных данных размером до 2^32 байт.

LONGTEXT

Тип MySQL LONGTEXT, для текста длиной до 2^32 символов.

MEDIUMBLOB

Тип MySQL MEDIUMBLOB, для двоичных данных размером до 2^24 байт.

MEDIUMINT

Тип MySQL MEDIUMINTEGER.

MEDIUMTEXT

Тип MySQL MEDIUMTEXT, для текста до 2^24 символов.

NCHAR

Тип MySQL NCHAR.

NUMERIC

MySQL Тип NUMERIC.

NVARCHAR

MySQL Тип NVARCHAR.

REAL

MySQL РЕАЛЬНЫЙ тип.

SET

MySQL Тип SET.

SMALLINT

Тип MySQL SMALLINTEGER.

TIME

MySQL Тип ВРЕМЯ.

TIMESTAMP

Тип MySQL TIMESTAMP.

TINYBLOB

Тип MySQL TINYBLOB, для двоичных данных размером до 2^8 байт.

TINYINT

Тип MySQL TINYINT.

TINYTEXT

Тип MySQL TINYTEXT, для текста до 2^8 символов.

VARCHAR

Тип MySQL VARCHAR, для символьных данных переменной длины.

YEAR

Тип MySQL YEAR, для однобайтового хранения годов 1901-2155.

class sqlalchemy.dialects.mysql.BIGINT

Тип MySQL BIGINTEGER.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.BIGINT (sqlalchemy.dialects.mysql.types._IntegerType, sqlalchemy.types.BIGINT)

method sqlalchemy.dialects.mysql.BIGINT.__init__(display_width=None, **kw)

Сконструируйте BIGINTEGER.

Параметры:
  • display_width – Необязательно, максимальная ширина отображения для данного числа.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.BINARY

Тип SQL BINARY.

Классная подпись

класс sqlalchemy.dialects.mysql.BINARY (sqlalchemy.types._Binary)

class sqlalchemy.dialects.mysql.BIT

MySQL Тип BIT.

Этот тип предназначен для MySQL 5.0.3 или выше для MyISAM, и 5.0.5 или выше для MyISAM, MEMORY, InnoDB и BDB. Для более старых версий используйте тип MSTinyInteger().

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.BIT (sqlalchemy.types.TypeEngine)

method sqlalchemy.dialects.mysql.BIT.__init__(length=None)

Постройте БИТ.

Параметры:

length – Необязательно, количество бит.

class sqlalchemy.dialects.mysql.BLOB

Тип SQL BLOB.

Классная подпись

класс sqlalchemy.dialects.mysql.BLOB (sqlalchemy.types.LargeBinary)

method sqlalchemy.dialects.mysql.BLOB.__init__(length: Optional[int] = None)

наследуется от sqlalchemy.types.LargeBinary.__init__ метода LargeBinary

Создайте тип LargeBinary.

Параметры:

length – опционально, длина столбца для использования в DDL-запросах, для тех бинарных типов, которые принимают длину, например, тип MySQL BLOB.

class sqlalchemy.dialects.mysql.BOOLEAN

Тип SQL BOOLEAN.

Классная подпись

класс sqlalchemy.dialects.mysql.BOOLEAN (sqlalchemy.types.Boolean)

method sqlalchemy.dialects.mysql.BOOLEAN.__init__(create_constraint: bool = False, name: Optional[str] = None, _create_events: bool = True, _adapted_from: Optional[SchemaType] = None)

наследуется от sqlalchemy.types.Boolean.__init__ метода Boolean

Сконструируйте булево значение.

Параметры:
  • create_constraint – по умолчанию имеет значение False. Если булево значение генерируется как int/smallint, также создайте ограничение CHECK на таблице, которое гарантирует 1 или 0 в качестве значения. … примечание:: настоятельно рекомендуется, чтобы ограничение CHECK имело явное имя для поддержки управления схемой. Это можно сделать либо путем установки параметра Boolean.name, либо путем создания соответствующего соглашения об именовании; см. справочную информацию в Настройка соглашений об именовании ограничений. … versionchanged:: 1.4 - этот флаг теперь имеет значение по умолчанию False, что означает, что для неродного перечислимого типа не генерируется ограничение CHECK.

  • name – если создается ограничение CHECK, укажите имя ограничения.

class sqlalchemy.dialects.mysql.CHAR

Тип MySQL CHAR, для символьных данных фиксированной длины.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.CHAR (sqlalchemy.dialects.mysql.types._StringType, sqlalchemy.types.CHAR)

method sqlalchemy.dialects.mysql.CHAR.__init__(length=None, **kwargs)

Постройте CHAR.

Параметры:
  • length – Максимальная длина данных, в символах.

  • binary – Необязательно, используйте двоичное сложение по умолчанию для национального набора символов. Это не влияет на тип хранимых данных, используйте тип BINARY для двоичных данных.

  • collation – Необязательно, запрашивает конкретную корелляцию. Должна быть совместима с национальным набором символов.

class sqlalchemy.dialects.mysql.DATE

Тип SQL DATE.

Классная подпись

класс sqlalchemy.dialects.mysql.DATE (sqlalchemy.types.Date)

class sqlalchemy.dialects.mysql.DATETIME

Тип MySQL DATETIME.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.DATETIME (sqlalchemy.types.DATETIME)

method sqlalchemy.dialects.mysql.DATETIME.__init__(timezone=False, fsp=None)

Создайте тип MySQL DATETIME.

Параметры:
  • timezone – не используется диалектом MySQL.

  • fsp – Дробное значение точности секунд. MySQL 5.6.4 поддерживает хранение дробных секунд; этот параметр будет использоваться при создании DDL для типа DATETIME. … примечание:: Поддержка дробных секунд драйверами DBAPI может быть ограничена; текущая поддержка включает MySQL Connector/Python.

class sqlalchemy.dialects.mysql.DECIMAL

Тип MySQL DECIMAL.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.DECIMAL (sqlalchemy.dialects.mysql.types._NumericType, sqlalchemy.types.DECIMAL)

method sqlalchemy.dialects.mysql.DECIMAL.__init__(precision=None, scale=None, asdecimal=True, **kw)

Постройте ДЕЦИМАЛ.

Параметры:
  • precision – Общее количество цифр в данном числе. Если масштаб и точность равны None, значения сохраняются в пределах, разрешенных сервером.

  • scale – Количество цифр после десятичной точки.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.DOUBLE

MySQL Тип DOUBLE.

Классная подпись

класс sqlalchemy.dialects.mysql.DOUBLE (sqlalchemy.dialects.mysql.types._FloatType, sqlalchemy.types.DOUBLE)

method sqlalchemy.dialects.mysql.DOUBLE.__init__(precision=None, scale=None, asdecimal=True, **kw)

Постройте ДВОЙКУ.

Примечание

Тип DOUBLE по умолчанию преобразует значения из float в Decimal, используя усечение по умолчанию до 10 цифр. Укажите scale=n или decimal_return_scale=n, чтобы изменить этот масштаб, или asdecimal=False, чтобы возвращать значения непосредственно как плавающие точки Python.

Параметры:
  • precision – Общее количество цифр в данном числе. Если масштаб и точность равны None, значения сохраняются в пределах, разрешенных сервером.

  • scale – Количество цифр после десятичной точки.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.ENUM

Тип MySQL ENUM.

Members

__init__()

Классная подпись

class sqlalchemy.dialects.mysql.ENUM (sqlalchemy.types.NativeForEmulated, sqlalchemy.types.Enum, sqlalchemy.dialects.mysql.types._StringType)

method sqlalchemy.dialects.mysql.ENUM.__init__(*enums, **kw)

Постройте ENUM.

Например:

Column('myenum', ENUM("foo", "bar", "baz"))
Параметры:
  • enums – Диапазон допустимых значений для данного ENUM. Значения в перечислениях не заключаются в кавычки, они будут экранированы и окружены одинарными кавычками при генерации схемы. Этот объект также может быть перечислимым типом, соответствующим стандарту PEP-435. … versionadded: 1.1 добавлена поддержка перечислимых типов, соответствующих стандарту PEP-435.

  • strict – Этот флаг не имеет никакого эффекта. … versionchanged:: Тип MySQL ENUM, а также базовый тип Enum теперь проверяет все значения данных Python.

  • charset – Необязательно, набор символов на уровне столбца для этого строкового значения. Имеет приоритет перед набором символов „ascii“ или „unicode“.

  • collation – Необязательно, collation на уровне столбцов для данного строкового значения. Имеет приоритет перед сокращением „binary“.

  • ascii – По умолчанию False: сокращение для набора символов latin1, генерирует ASCII в схеме.

  • unicode – По умолчанию False: сокращение для набора символов ucs2, в схеме генерируется UNICODE.

  • binary – По умолчанию False: сокращенно, выбирает тип двоичной раскладки, соответствующий набору символов столбца. Генерирует BINARY в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.

class sqlalchemy.dialects.mysql.FLOAT

MySQL Тип FLOAT.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.FLOAT (sqlalchemy.dialects.mysql.types._FloatType, sqlalchemy.types.FLOAT)

method sqlalchemy.dialects.mysql.FLOAT.__init__(precision=None, scale=None, asdecimal=False, **kw)

Постройте FLOAT.

Параметры:
  • precision – Общее количество цифр в данном числе. Если масштаб и точность равны None, значения сохраняются в пределах, разрешенных сервером.

  • scale – Количество цифр после десятичной точки.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.INTEGER

MySQL Тип INTEGER.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.INTEGER (sqlalchemy.dialects.mysql.types._IntegerType, sqlalchemy.types.INTEGER)

method sqlalchemy.dialects.mysql.INTEGER.__init__(display_width=None, **kw)

Сконструируйте INTEGER.

Параметры:
  • display_width – Необязательно, максимальная ширина отображения для данного числа.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.JSON

Тип MySQL JSON.

MySQL поддерживает JSON начиная с версии 5.7. MariaDB поддерживает JSON (как псевдоним для LONGTEXT) начиная с версии 10.2.

JSON используется автоматически всякий раз, когда базовый тип данных JSON используется против бэкенда MySQL или MariaDB.

См.также

JSON - основная документация по общему кроссплатформенному типу данных JSON.

Тип JSON поддерживает сохранение значений JSON, а также основные индексные операции, предоставляемые типом данных JSON, путем адаптации операций для отображения функции JSON_EXTRACT на уровне базы данных.

Классная подпись

класс sqlalchemy.dialects.mysql.JSON (sqlalchemy.types.JSON)

class sqlalchemy.dialects.mysql.LONGBLOB

Тип MySQL LONGBLOB, для двоичных данных размером до 2^32 байт.

Классная подпись

класс sqlalchemy.dialects.mysql.LONGBLOB (sqlalchemy.types._Binary)

class sqlalchemy.dialects.mysql.LONGTEXT

Тип MySQL LONGTEXT, для текста длиной до 2^32 символов.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.LONGTEXT (sqlalchemy.dialects.mysql.types._StringType)

method sqlalchemy.dialects.mysql.LONGTEXT.__init__(**kwargs)

Постройте LONGTEXT.

Параметры:
  • charset – Необязательно, набор символов на уровне столбца для этого строкового значения. Имеет приоритет перед набором символов „ascii“ или „unicode“.

  • collation – Необязательно, collation на уровне столбцов для данного строкового значения. Имеет приоритет перед сокращением „binary“.

  • ascii – По умолчанию False: сокращение для набора символов latin1, генерирует ASCII в схеме.

  • unicode – По умолчанию False: сокращение для набора символов ucs2, в схеме генерируется UNICODE.

  • national – Необязательно. Если true, используйте настроенный национальный набор символов сервера.

  • binary – По умолчанию False: сокращенно, выбирает тип двоичной раскладки, соответствующий набору символов столбца. Генерирует BINARY в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.

class sqlalchemy.dialects.mysql.MEDIUMBLOB

Тип MySQL MEDIUMBLOB, для двоичных данных размером до 2^24 байт.

Классная подпись

класс sqlalchemy.dialects.mysql.MEDIUMBLOB (sqlalchemy.types._Binary)

class sqlalchemy.dialects.mysql.MEDIUMINT

Тип MySQL MEDIUMINTEGER.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.MEDIUMINT (sqlalchemy.dialects.mysql.types._IntegerType)

method sqlalchemy.dialects.mysql.MEDIUMINT.__init__(display_width=None, **kw)

Построить СРЕДНИЙ МИНТЕГЕР

Параметры:
  • display_width – Необязательно, максимальная ширина отображения для данного числа.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.MEDIUMTEXT

Тип MySQL MEDIUMTEXT, для текста до 2^24 символов.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.MEDIUMTEXT (sqlalchemy.dialects.mysql.types._StringType)

method sqlalchemy.dialects.mysql.MEDIUMTEXT.__init__(**kwargs)

Создайте СРЕДНИЙ ТЕКСТ.

Параметры:
  • charset – Необязательно, набор символов на уровне столбца для этого строкового значения. Имеет приоритет перед набором символов „ascii“ или „unicode“.

  • collation – Необязательно, collation на уровне столбцов для данного строкового значения. Имеет приоритет перед сокращением „binary“.

  • ascii – По умолчанию False: сокращение для набора символов latin1, генерирует ASCII в схеме.

  • unicode – По умолчанию False: сокращение для набора символов ucs2, в схеме генерируется UNICODE.

  • national – Необязательно. Если true, используйте настроенный национальный набор символов сервера.

  • binary – По умолчанию False: сокращенно, выбирает тип двоичной раскладки, соответствующий набору символов столбца. Генерирует BINARY в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.

class sqlalchemy.dialects.mysql.NCHAR

Тип MySQL NCHAR.

Для символьных данных фиксированной длины в настроенном национальном наборе символов сервера.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.NCHAR (sqlalchemy.dialects.mysql.types._StringType, sqlalchemy.types.NCHAR)

method sqlalchemy.dialects.mysql.NCHAR.__init__(length=None, **kwargs)

Сконструируйте NCHAR.

Параметры:
  • length – Максимальная длина данных, в символах.

  • binary – Необязательно, используйте двоичное сложение по умолчанию для национального набора символов. Это не влияет на тип хранимых данных, используйте тип BINARY для двоичных данных.

  • collation – Необязательно, запрашивает конкретную корелляцию. Должна быть совместима с национальным набором символов.

class sqlalchemy.dialects.mysql.NUMERIC

MySQL Тип NUMERIC.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.NUMERIC (sqlalchemy.dialects.mysql.types._NumericType, sqlalchemy.types.NUMERIC)

method sqlalchemy.dialects.mysql.NUMERIC.__init__(precision=None, scale=None, asdecimal=True, **kw)

Сконструируйте ЧИСЛО.

Параметры:
  • precision – Общее количество цифр в данном числе. Если масштаб и точность равны None, значения сохраняются в пределах, разрешенных сервером.

  • scale – Количество цифр после десятичной точки.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.NVARCHAR

MySQL Тип NVARCHAR.

Для символьных данных переменной длины в настроенном национальном наборе символов сервера.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.NVARCHAR (sqlalchemy.dialects.mysql.types._StringType, sqlalchemy.types.NVARCHAR)

method sqlalchemy.dialects.mysql.NVARCHAR.__init__(length=None, **kwargs)

Сконструируйте NVARCHAR.

Параметры:
  • length – Максимальная длина данных, в символах.

  • binary – Необязательно, используйте двоичное сложение по умолчанию для национального набора символов. Это не влияет на тип хранимых данных, используйте тип BINARY для двоичных данных.

  • collation – Необязательно, запрашивает конкретную корелляцию. Должна быть совместима с национальным набором символов.

class sqlalchemy.dialects.mysql.REAL

MySQL РЕАЛЬНЫЙ тип.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.REAL (sqlalchemy.dialects.mysql.types._FloatType, sqlalchemy.types.REAL)

method sqlalchemy.dialects.mysql.REAL.__init__(precision=None, scale=None, asdecimal=True, **kw)

Постройте РЕАЛ.

Примечание

Тип REAL по умолчанию преобразует значения из float в Decimal, используя усечение по умолчанию до 10 цифр. Укажите scale=n или decimal_return_scale=n, чтобы изменить этот масштаб, или asdecimal=False, чтобы возвращать значения непосредственно как плавающие точки Python.

Параметры:
  • precision – Общее количество цифр в данном числе. Если масштаб и точность равны None, значения сохраняются в пределах, разрешенных сервером.

  • scale – Количество цифр после десятичной точки.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.SET

MySQL Тип SET.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.SET (sqlalchemy.dialects.mysql.types._StringType)

method sqlalchemy.dialects.mysql.SET.__init__(*values, **kw)

Постройте сет.

Например:

Column('myset', SET("foo", "bar", "baz"))

Список потенциальных значений необходим в том случае, если этот набор будет использоваться для генерации DDL для таблицы, или если флаг SET.retrieve_as_bitwise установлен в True.

Параметры:
  • values – Диапазон допустимых значений для данного SET. Значения не заключаются в кавычки, при генерации схемы они будут экранированы и окружены одинарными кавычками.

  • convert_unicode – Тот же флаг, что и у String.convert_unicode.

  • collation – как и String.collation.

  • charset – такой же, как у VARCHAR.charset.

  • ascii – такой же, как у VARCHAR.ascii.

  • unicode – такой же, как у VARCHAR.unicode.

  • binary – такой же, как у VARCHAR.binary.

  • retrieve_as_bitwise – если True, данные для типа set будут сохраняться и выбираться с помощью целочисленного значения, где set принудительно преобразуется в битовую маску для сохранения. MySQL допускает такой режим, преимуществом которого является возможность однозначного хранения значений, таких как пустая строка ''. Тип данных будет отображаться как выражение col + 0 в операторе SELECT, так что в наборах результатов значение будет преобразовано в целочисленное. Этот флаг необходим, если вы хотите сохранить набор, который может хранить пустую строку '' в качестве значения. … предупреждение:: При использовании SET.retrieve_as_bitwise необходимо, чтобы список значений набора был выражен в точно таком же порядке, какой существует в базе данных MySQL.

class sqlalchemy.dialects.mysql.SMALLINT

Тип MySQL SMALLINTEGER.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.SMALLINT (sqlalchemy.dialects.mysql.types._IntegerType, sqlalchemy.types.SMALLINT)

method sqlalchemy.dialects.mysql.SMALLINT.__init__(display_width=None, **kw)

Сконструируйте SMALLINTEGER.

Параметры:
  • display_width – Необязательно, максимальная ширина отображения для данного числа.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.TEXT

Тип MySQL TEXT, для текста до 2^16 символов.

Классная подпись

класс sqlalchemy.dialects.mysql.TEXT (sqlalchemy.dialects.mysql.types._StringType, sqlalchemy.types.TEXT)

method sqlalchemy.dialects.mysql.TEXT.__init__(length=None, **kw)

Постройте ТЕКСТ.

Параметры:
  • length – Необязательно, если указано, сервер может оптимизировать хранение, подставляя наименьший тип TEXT, достаточный для хранения length символов.

  • charset – Необязательно, набор символов на уровне столбца для этого строкового значения. Имеет приоритет перед набором символов „ascii“ или „unicode“.

  • collation – Необязательно, collation на уровне столбцов для данного строкового значения. Имеет приоритет перед сокращением „binary“.

  • ascii – По умолчанию False: сокращение для набора символов latin1, генерирует ASCII в схеме.

  • unicode – По умолчанию False: сокращение для набора символов ucs2, в схеме генерируется UNICODE.

  • national – Необязательно. Если true, используйте настроенный национальный набор символов сервера.

  • binary – По умолчанию False: сокращенно, выбирает тип двоичной раскладки, соответствующий набору символов столбца. Генерирует BINARY в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.

class sqlalchemy.dialects.mysql.TIME

MySQL Тип ВРЕМЯ.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.TIME (sqlalchemy.types.TIME)

method sqlalchemy.dialects.mysql.TIME.__init__(timezone=False, fsp=None)

Сконструируйте тип MySQL TIME.

Параметры:
  • timezone – не используется диалектом MySQL.

  • fsp – Дробное значение точности секунд. MySQL 5.6 поддерживает хранение дробных секунд; этот параметр будет использоваться при создании DDL для типа TIME. … примечание:: Поддержка дробных секунд драйверами DBAPI может быть ограничена; текущая поддержка включает MySQL Connector/Python.

class sqlalchemy.dialects.mysql.TIMESTAMP

Тип MySQL TIMESTAMP.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.TIMESTAMP (sqlalchemy.types.TIMESTAMP)

method sqlalchemy.dialects.mysql.TIMESTAMP.__init__(timezone=False, fsp=None)

Создайте тип MySQL TIMESTAMP.

Параметры:
  • timezone – не используется диалектом MySQL.

  • fsp – Дробное значение точности секунд. MySQL 5.6.4 поддерживает хранение дробных секунд; этот параметр будет использоваться при создании DDL для типа TIMESTAMP. … примечание:: Поддержка дробных секунд драйверами DBAPI может быть ограничена; текущая поддержка включает MySQL Connector/Python.

class sqlalchemy.dialects.mysql.TINYBLOB

Тип MySQL TINYBLOB, для двоичных данных размером до 2^8 байт.

Классная подпись

класс sqlalchemy.dialects.mysql.TINYBLOB (sqlalchemy.types._Binary)

class sqlalchemy.dialects.mysql.TINYINT

Тип MySQL TINYINT.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.TINYINT (sqlalchemy.dialects.mysql.types._IntegerType)

method sqlalchemy.dialects.mysql.TINYINT.__init__(display_width=None, **kw)

Постройте TINYINT.

Параметры:
  • display_width – Необязательно, максимальная ширина отображения для данного числа.

  • unsigned – булево значение, необязательное.

  • zerofill – Необязательно. Если значение равно true, значения будут храниться как строки, дополненные нулями. Обратите внимание, что это не влияет на значения, возвращаемые API базовой базы данных, которые продолжают быть числовыми.

class sqlalchemy.dialects.mysql.TINYTEXT

Тип MySQL TINYTEXT, для текста до 2^8 символов.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.TINYTEXT (sqlalchemy.dialects.mysql.types._StringType)

method sqlalchemy.dialects.mysql.TINYTEXT.__init__(**kwargs)

Постройте TINYTEXT.

Параметры:
  • charset – Необязательно, набор символов на уровне столбца для этого строкового значения. Имеет приоритет перед набором символов „ascii“ или „unicode“.

  • collation – Необязательно, collation на уровне столбцов для данного строкового значения. Имеет приоритет перед сокращением „binary“.

  • ascii – По умолчанию False: сокращение для набора символов latin1, генерирует ASCII в схеме.

  • unicode – По умолчанию False: сокращение для набора символов ucs2, в схеме генерируется UNICODE.

  • national – Необязательно. Если true, используйте настроенный национальный набор символов сервера.

  • binary – По умолчанию False: сокращенно, выбирает тип двоичной раскладки, соответствующий набору символов столбца. Генерирует BINARY в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.

class sqlalchemy.dialects.mysql.VARBINARY

Тип SQL VARBINARY.

Классная подпись

класс sqlalchemy.dialects.mysql.VARBINARY (sqlalchemy.types._Binary)

class sqlalchemy.dialects.mysql.VARCHAR

Тип MySQL VARCHAR, для символьных данных переменной длины.

Members

__init__()

Классная подпись

класс sqlalchemy.dialects.mysql.VARCHAR (sqlalchemy.dialects.mysql.types._StringType, sqlalchemy.types.VARCHAR)

method sqlalchemy.dialects.mysql.VARCHAR.__init__(length=None, **kwargs)

Сконструируйте VARCHAR.

Параметры:
  • charset – Необязательно, набор символов на уровне столбца для этого строкового значения. Имеет приоритет перед набором символов „ascii“ или „unicode“.

  • collation – Необязательно, collation на уровне столбцов для данного строкового значения. Имеет приоритет перед сокращением „binary“.

  • ascii – По умолчанию False: сокращение для набора символов latin1, генерирует ASCII в схеме.

  • unicode – По умолчанию False: сокращение для набора символов ucs2, в схеме генерируется UNICODE.

  • national – Необязательно. Если true, используйте настроенный национальный набор символов сервера.

  • binary – По умолчанию False: сокращенно, выбирает тип двоичной раскладки, соответствующий набору символов столбца. Генерирует BINARY в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.

class sqlalchemy.dialects.mysql.YEAR

Тип MySQL YEAR, для однобайтового хранения годов 1901-2155.

Классная подпись

класс sqlalchemy.dialects.mysql.YEAR (sqlalchemy.types.TypeEngine)

Конструкции MySQL DML

Object Name Description

insert(table)

Создайте специфичную для MySQL/MariaDB конструкцию варианта Insert.

Insert

Специфическая для MySQL реализация INSERT.

function sqlalchemy.dialects.mysql.insert(table)

Создайте специфичную для MySQL/MariaDB конструкцию варианта Insert.

Функция sqlalchemy.dialects.mysql.insert() создает sqlalchemy.dialects.mysql.Insert. Этот класс основан на диалектно-агностической конструкции Insert, которая может быть построена с помощью функции insert() в SQLAlchemy Core.

Конструкция Insert включает дополнительные методы Insert.on_duplicate_key_update().

class sqlalchemy.dialects.mysql.Insert

Специфическая для MySQL реализация INSERT.

Добавляет методы для специфических для MySQL синтаксисов, таких как ON DUPLICATE KEY UPDATE.

Объект Insert создается с помощью функции sqlalchemy.dialects.mysql.insert().

Добавлено в версии 1.2.

Классная подпись

класс sqlalchemy.dialects.mysql.Insert (sqlalchemy.sql.expression.Insert)

attribute sqlalchemy.dialects.mysql.Insert.inherit_cache: Optional[bool] = False

Укажите, должен ли данный экземпляр HasCacheKey использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.

По умолчанию атрибут имеет значение None, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значения False, за исключением того, что при этом выдается предупреждение.

Этот флаг может быть установлен в True на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.

См.также

Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута HasCacheKey.inherit_cache для сторонних или определенных пользователем конструкций SQL.

attribute sqlalchemy.dialects.mysql.Insert.inserted

Предоставьте пространство имен «inserted» для оператора ON DUPLICATE KEY UPDATE

Пункт ON DUPLICATE KEY UPDATE в MySQL позволяет ссылаться на строку, которая будет вставлена, через специальную функцию VALUES(). Этот атрибут обеспечивает возможность ссылки на все столбцы в этой строке так, что они будут отображаться в функции VALUES() внутри предложения ON DUPLICATE KEY UPDATE. Атрибут назван .inserted, чтобы не конфликтовать с существующим методом Insert.values().

Совет

Атрибут Insert.inserted является экземпляром ColumnCollection, который предоставляет интерфейс, аналогичный интерфейсу коллекции Table.c, описанной в Доступ к таблицам и столбцам. В этой коллекции обычные имена доступны как атрибуты (например, stmt.inserted.some_column), но к специальным именам и именам методов словаря следует обращаться с помощью индексного доступа, например, stmt.inserted["column name"] или stmt.inserted["values"]. Дополнительные примеры см. в строке документации для ColumnCollection.

См.также

INSERT…ON DUPLICATE KEY UPDATE (Upsert) - пример использования Insert.inserted

method sqlalchemy.dialects.mysql.Insert.on_duplicate_key_update(*args, **kw) Self

Указывает предложение ON DUPLICATE KEY UPDATE.

Параметры:

**kw – Ключи столбцов, связанные со значениями UPDATE. Значениями могут быть любые выражения SQL или поддерживаемые литеральные значения Python.

Предупреждение

Этот словарь не учитывает значения UPDATE по умолчанию, определенные в Python, или функции генерации, например, указанные с помощью Column.onupdate. Эти значения не будут использоваться для UPDATE в стиле ON DUPLICATE KEY UPDATE, если значения не указаны здесь вручную.

Параметры:

*args – В качестве альтернативы передаче параметров ключ/значение, словарь или список из двух кортежей может быть передан как один позиционный аргумент. Передача одного словаря эквивалентна форме аргумента ключевого слова:: insert().on_duplicate_key_update({«name»: «some name»}) Передача списка из двух кортежей указывает, что назначения параметров в предложении UPDATE должны быть упорядочены как отправленные, способом, аналогичным описанному для конструкции Update в целом в Упорядоченные по параметрам обновления:: insert(). on_duplicate_key_update( [(«имя», «некоторое имя»), («значение», «некоторое значение»)]) … versionchanged:: 1.3 параметры могут быть заданы в виде словаря или списка из двух кортежей; последняя форма обеспечивает упорядочивание параметров.

Добавлено в версии 1.2.

mysqlclient (форк MySQL-Python)

Support for the MySQL / MariaDB database via the mysqlclient (maintained fork of MySQL-Python) driver.

DBAPI

Documentation and download information (if applicable) for mysqlclient (maintained fork of MySQL-Python) is available at: https://pypi.org/project/mysqlclient/

Connecting

Connect String:

mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>

Статус водителя

mysqlclient DBAPI - это поддерживаемый форк MySQL-Python DBAPI, который больше не поддерживается. mysqlclient поддерживает Python 2 и Python 3 и является очень стабильным.

Юникод

Текущие рекомендации по работе с юникодом см. в Юникод.

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

СУБД mysqlclient и PyMySQL принимают дополнительный словарь под ключом «ssl», который может быть указан с помощью команды create_engine.connect_args dictionary:

engine = create_engine(
    "mysql+mysqldb://scott:tiger@192.168.0.134/test",
    connect_args={
        "ssl": {
            "ca": "/home/gord/client-ssl/ca.pem",
            "cert": "/home/gord/client-ssl/client-cert.pem",
            "key": "/home/gord/client-ssl/client-key.pem"
        }
    }
)

Для удобства следующие ключи также могут быть указаны в строке URL, где они будут автоматически интерпретированы в словарь «ssl»: «ssl_ca», «ssl_cert», «ssl_key», «ssl_capath», «ssl_cipher», «ssl_check_hostname». Пример следующий:

connection_uri = (
    "mysql+mysqldb://scott:tiger@192.168.0.134/test"
    "?ssl_ca=/home/gord/client-ssl/ca.pem"
    "&ssl_cert=/home/gord/client-ssl/client-cert.pem"
    "&ssl_key=/home/gord/client-ssl/client-key.pem"
)

См.также

SSL-соединения в диалекте PyMySQL

Использование MySQLdb с Google Cloud SQL

Google Cloud SQL теперь рекомендует использовать диалект MySQLdb. Подключитесь, используя URL-адрес, подобный следующему:

mysql+mysqldb://root@/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename>

Курсоры на стороне сервера

Диалект mysqldb поддерживает курсоры на стороне сервера. См. Курсоры на стороне сервера.

PyMySQL

Support for the MySQL / MariaDB database via the PyMySQL driver.

DBAPI

Documentation and download information (if applicable) for PyMySQL is available at: https://pymysql.readthedocs.io/

Connecting

Connect String:

mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

Юникод

Текущие рекомендации по работе с юникодом см. в Юникод.

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

PyMySQL DBAPI принимает те же SSL-аргументы, что и MySQLdb, описанный в SSL-соединения. Дополнительные примеры смотрите в этом разделе.

Если сервер использует автоматически созданный сертификат, который является самоподписанным или не соответствует имени хоста (как видно с клиента), может также потребоваться указать ssl_check_hostname=false в PyMySQL:

connection_uri = (
    "mysql+pymysql://scott:tiger@192.168.0.134/test"
    "?ssl_ca=/home/gord/client-ssl/ca.pem"
    "&ssl_cert=/home/gord/client-ssl/client-cert.pem"
    "&ssl_key=/home/gord/client-ssl/client-key.pem"
    "&ssl_check_hostname=false"
)

Совместимость MySQL-Python

pymysql DBAPI является чистым Python-портом драйвера MySQL-python (MySQLdb) и нацелен на 100% совместимость. Большинство замечаний по поведению MySQL-python применимы и к драйверу pymysql.

MariaDB-Connector

Support for the MySQL / MariaDB database via the MariaDB Connector/Python driver.

DBAPI

Documentation and download information (if applicable) for MariaDB Connector/Python is available at: https://pypi.org/project/mariadb/

Connecting

Connect String:

mariadb+mariadbconnector://<user>:<password>@<host>[:<port>]/<dbname>

Статус водителя

MariaDB Connector/Python позволяет программам на языке Python получать доступ к базам данных MariaDB и MySQL с помощью API, который соответствует Python DB API 2.0 (PEP-249). Он написан на языке C и использует клиентскую библиотеку MariaDB Connector/C для связи клиент-сервер.

Обратите внимание, что драйвером по умолчанию для URI соединения mariadb:// по-прежнему является mysqldb. Для использования этого драйвера требуется mariadb+mariadbconnector://.

MySQL-Connector

Support for the MySQL / MariaDB database via the MySQL Connector/Python driver.

DBAPI

Documentation and download information (if applicable) for MySQL Connector/Python is available at: https://pypi.org/project/mysql-connector-python/

Connecting

Connect String:

mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>

Примечание

С момента выпуска MySQL Connector/Python DBAPI было много проблем, некоторые из которых могут оставаться нерешенными, и диалект mysqlconnector не тестируется в рамках непрерывной интеграции SQLAlchemy. Рекомендуемые диалекты MySQL - mysqlclient и PyMySQL.

asyncmy

Поддержка базы данных MySQL / MariaDB через драйвер asyncmy.

DBAPI

Documentation and download information (if applicable) for asyncmy is available at: https://github.com/long2ice/asyncmy

Подключение

Connect String:

mysql+asyncmy://user:password@host:port/dbname[?key=value&key=value...]

Примечание

Диалект asyncmy по состоянию на сентябрь 2021 года был добавлен для обеспечения совместимости с MySQL/MariaDB asyncio, поскольку драйвер базы данных aiomysql стал необслуживаемым, однако сам по себе asyncmy является очень новым.

Используя специальный посреднический слой asyncio, диалект asyncmy можно использовать в качестве бэкенда для пакета расширения SQLAlchemy asyncio.

Обычно этот диалект следует использовать только с функцией создания двигателя create_async_engine():

from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine("mysql+asyncmy://user:pass@hostname/dbname?charset=utf8mb4")

aiomysql

Поддержка базы данных MySQL / MariaDB через драйвер aiomysql.

DBAPI

Documentation and download information (if applicable) for aiomysql is available at: https://github.com/aio-libs/aiomysql

Подключение

Connect String:

mysql+aiomysql://user:password@host:port/dbname[?key=value&key=value...]

Предупреждение

Диалект aiomysql в настоящее время не тестируется в рамках непрерывной интеграции SQLAlchemy. По состоянию на сентябрь 2021 года драйвер не поддерживается и больше не работает для Python версии 3.10, а также зависит от значительно устаревшей версии PyMySQL. Пожалуйста, обратитесь к диалекту asyncmy для текущей функциональности MySQL/MariaDB asyncio.

Диалект aiomysql - это второй диалект SQLAlchemy на языке Python asyncio.

Используя специальный посреднический слой asyncio, диалект aiomysql можно использовать в качестве бэкенда для пакета расширения SQLAlchemy asyncio.

Обычно этот диалект следует использовать только с функцией создания двигателя create_async_engine():

from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine("mysql+aiomysql://user:pass@hostname/dbname?charset=utf8mb4")

cymysql

Support for the MySQL / MariaDB database via the CyMySQL driver.

DBAPI

Documentation and download information (if applicable) for CyMySQL is available at: https://github.com/nakagami/CyMySQL

Connecting

Connect String:

mysql+cymysql://<username>:<password>@<host>/<dbname>[?<options>]

Примечание

Диалект CyMySQL не тестируется в рамках непрерывной интеграции SQLAlchemy и может иметь нерешенные проблемы. Рекомендуемые диалекты MySQL - mysqlclient и PyMySQL.

pyodbc

Поддержка базы данных MySQL / MariaDB через драйвер PyODBC.

DBAPI

Documentation and download information (if applicable) for PyODBC is available at: https://pypi.org/project/pyodbc/

Подключение

Connect String:

mysql+pyodbc://<username>:<password>@<dsnname>

Примечание

Диалект PyODBC для MySQL не тестируется в рамках непрерывной интеграции SQLAlchemy. Рекомендуемыми диалектами MySQL являются mysqlclient и PyMySQL. Однако, если вы хотите использовать диалект mysql+pyodbc и вам требуется полная поддержка символов utf8mb4 (включая дополнительные символы, такие как emoji), убедитесь, что используете текущий выпуск MySQL Connector/ODBC и укажите «ANSI» (не «Unicode») версию драйвера в вашем DSN или строке подключения.

Передайте точную строку подключения pyodbc:

import urllib
connection_string = (
    'DRIVER=MySQL ODBC 8.0 ANSI Driver;'
    'SERVER=localhost;'
    'PORT=3307;'
    'DATABASE=mydb;'
    'UID=root;'
    'PWD=(whatever);'
    'charset=utf8mb4;'
)
params = urllib.parse.quote_plus(connection_string)
connection_uri = "mysql+pyodbc:///?odbc_connect=%s" % params
Вернуться на верх