MySQL и MariaDB¶
Support for the MySQL / MariaDB database.
The following table summarizes current support levels for database release versions.
Support type |
Versions |
---|---|
5.6, 5.7, 8.0 / 10.4, 10.5 |
|
5.6+ / 10+ |
|
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
или любой другой, эквивалентный для целевого диалекта, при подключении. В настоящее время эта настройка жестко закодирована.
См.также
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.
Более подробную информацию можно найти на сайте:
Парсеры индексов¶
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 |
---|---|
Произведите предложение |
- 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.
См.также
Классная подпись
класс
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 |
---|---|
Тип MySQL BIGINTEGER. |
|
MySQL Тип BIT. |
|
Тип MySQL CHAR, для символьных данных фиксированной длины. |
|
Тип MySQL DATETIME. |
|
Тип MySQL DECIMAL. |
|
Тип MySQL ENUM. |
|
MySQL Тип FLOAT. |
|
MySQL Тип INTEGER. |
|
Тип MySQL JSON. |
|
Тип MySQL LONGBLOB, для двоичных данных размером до 2^32 байт. |
|
Тип MySQL LONGTEXT, для текста длиной до 2^32 символов. |
|
Тип MySQL MEDIUMBLOB, для двоичных данных размером до 2^24 байт. |
|
Тип MySQL MEDIUMINTEGER. |
|
Тип MySQL MEDIUMTEXT, для текста до 2^24 символов. |
|
Тип MySQL NCHAR. |
|
MySQL Тип NUMERIC. |
|
MySQL Тип NVARCHAR. |
|
MySQL РЕАЛЬНЫЙ тип. |
|
MySQL Тип SET. |
|
Тип MySQL SMALLINTEGER. |
|
MySQL Тип ВРЕМЯ. |
|
Тип MySQL TIMESTAMP. |
|
Тип MySQL TINYBLOB, для двоичных данных размером до 2^8 байт. |
|
Тип MySQL TINYINT. |
|
Тип MySQL TINYTEXT, для текста до 2^8 символов. |
|
Тип MySQL VARCHAR, для символьных данных переменной длины. |
|
Тип MySQL YEAR, для однобайтового хранения годов 1901-2155. |
- class sqlalchemy.dialects.mysql.BIGINT¶
Тип MySQL BIGINTEGER.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- 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
Классная подпись
класс
sqlalchemy.dialects.mysql.BIT
(sqlalchemy.types.TypeEngine
)-
method
sqlalchemy.dialects.mysql.BIT.
__init__(length=None)¶ Постройте БИТ.
- Параметры:
length – Необязательно, количество бит.
-
method
- 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.
-
method
- 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, укажите имя ограничения.
-
method
- class sqlalchemy.dialects.mysql.CHAR¶
Тип MySQL CHAR, для символьных данных фиксированной длины.
Members
Классная подпись
класс
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 – Необязательно, запрашивает конкретную корелляцию. Должна быть совместима с национальным набором символов.
-
method
- class sqlalchemy.dialects.mysql.DATE
Тип SQL DATE.
Классная подпись
класс
sqlalchemy.dialects.mysql.DATE
(sqlalchemy.types.Date
)
- class sqlalchemy.dialects.mysql.DATETIME¶
Тип MySQL DATETIME.
Members
Классная подпись
класс
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.
-
method
- class sqlalchemy.dialects.mysql.DECIMAL¶
Тип MySQL DECIMAL.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- 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 базовой базы данных, которые продолжают быть числовыми.
-
method
- class sqlalchemy.dialects.mysql.ENUM¶
Тип MySQL ENUM.
Members
Классная подпись
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 в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.
-
method
- class sqlalchemy.dialects.mysql.FLOAT¶
MySQL Тип FLOAT.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- class sqlalchemy.dialects.mysql.INTEGER¶
MySQL Тип INTEGER.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- 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
Классная подпись
класс
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 в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.
-
method
- class sqlalchemy.dialects.mysql.MEDIUMBLOB¶
Тип MySQL MEDIUMBLOB, для двоичных данных размером до 2^24 байт.
Классная подпись
класс
sqlalchemy.dialects.mysql.MEDIUMBLOB
(sqlalchemy.types._Binary
)
- class sqlalchemy.dialects.mysql.MEDIUMINT¶
Тип MySQL MEDIUMINTEGER.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- class sqlalchemy.dialects.mysql.MEDIUMTEXT¶
Тип MySQL MEDIUMTEXT, для текста до 2^24 символов.
Members
Классная подпись
класс
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 в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.
-
method
- class sqlalchemy.dialects.mysql.NCHAR¶
Тип MySQL NCHAR.
Для символьных данных фиксированной длины в настроенном национальном наборе символов сервера.
Members
Классная подпись
класс
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 – Необязательно, запрашивает конкретную корелляцию. Должна быть совместима с национальным набором символов.
-
method
- class sqlalchemy.dialects.mysql.NUMERIC¶
MySQL Тип NUMERIC.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- class sqlalchemy.dialects.mysql.NVARCHAR¶
MySQL Тип NVARCHAR.
Для символьных данных переменной длины в настроенном национальном наборе символов сервера.
Members
Классная подпись
класс
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 – Необязательно, запрашивает конкретную корелляцию. Должна быть совместима с национальным набором символов.
-
method
- class sqlalchemy.dialects.mysql.REAL¶
MySQL РЕАЛЬНЫЙ тип.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- class sqlalchemy.dialects.mysql.SET¶
MySQL Тип SET.
Members
Классная подпись
класс
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.
-
method
- class sqlalchemy.dialects.mysql.SMALLINT¶
Тип MySQL SMALLINTEGER.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- 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 в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.
-
method
- class sqlalchemy.dialects.mysql.TIME¶
MySQL Тип ВРЕМЯ.
Members
Классная подпись
класс
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.
-
method
- class sqlalchemy.dialects.mysql.TIMESTAMP¶
Тип MySQL TIMESTAMP.
Members
Классная подпись
класс
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.
-
method
- class sqlalchemy.dialects.mysql.TINYBLOB¶
Тип MySQL TINYBLOB, для двоичных данных размером до 2^8 байт.
Классная подпись
класс
sqlalchemy.dialects.mysql.TINYBLOB
(sqlalchemy.types._Binary
)
- class sqlalchemy.dialects.mysql.TINYINT¶
Тип MySQL TINYINT.
Members
Классная подпись
класс
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 базовой базы данных, которые продолжают быть числовыми.
-
method
- class sqlalchemy.dialects.mysql.TINYTEXT¶
Тип MySQL TINYTEXT, для текста до 2^8 символов.
Members
Классная подпись
класс
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 в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.
-
method
- class sqlalchemy.dialects.mysql.VARBINARY
Тип SQL VARBINARY.
Классная подпись
класс
sqlalchemy.dialects.mysql.VARBINARY
(sqlalchemy.types._Binary
)
- class sqlalchemy.dialects.mysql.VARCHAR¶
Тип MySQL VARCHAR, для символьных данных переменной длины.
Members
Классная подпись
класс
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 в схеме. Это не влияет на тип хранимых данных, только на колляцию символьных данных.
-
method
- 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 конструкцию варианта |
Специфическая для 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.
Members
Классная подпись
класс
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.
-
attribute
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