From 1759f58fc110b6c3ad81d859d6e5716182ad29d2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 20 Feb 2023 07:58:59 -0600 Subject: [PATCH] Ensure new MariaDB/MySQL tables are created using the InnoDB engine (#88468) Ensure new tables are created using InnoDB InnoDB is the only supported engine to use with MariaDB or MySQL as we currently have large keys in the states table that will not work with MyIASM. Other storage engines including Aria will likely work fine, but they are not officially supported. --- .../components/recorder/db_schema.py | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/recorder/db_schema.py b/homeassistant/components/recorder/db_schema.py index 3bdbb0d3c28..9a059c570c6 100644 --- a/homeassistant/components/recorder/db_schema.py +++ b/homeassistant/components/recorder/db_schema.py @@ -111,6 +111,15 @@ ENTITY_ID_LAST_UPDATED_INDEX_TS = "ix_states_entity_id_last_updated_ts" EVENTS_CONTEXT_ID_INDEX = "ix_events_context_id" STATES_CONTEXT_ID_INDEX = "ix_states_context_id" +_DEFAULT_TABLE_ARGS = { + "mysql_default_charset": "utf8mb4", + "mysql_collate": "utf8mb4_unicode_ci", + "mysql_engine": "InnoDB", + "mariadb_default_charset": "utf8mb4", + "mariadb_collate": "utf8mb4_unicode_ci", + "mariadb_engine": "InnoDB", +} + class FAST_PYSQLITE_DATETIME(sqlite.DATETIME): """Use ciso8601 to parse datetimes instead of sqlalchemy built-in regex.""" @@ -165,7 +174,7 @@ class Events(Base): # Used for fetching events at a specific time # see logbook Index("ix_events_event_type_time_fired_ts", "event_type", "time_fired_ts"), - {"mysql_default_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"}, + _DEFAULT_TABLE_ARGS, ) __tablename__ = TABLE_EVENTS event_id: Mapped[int] = mapped_column(Integer, Identity(), primary_key=True) @@ -256,9 +265,7 @@ class Events(Base): class EventData(Base): """Event data history.""" - __table_args__ = ( - {"mysql_default_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"}, - ) + __table_args__ = (_DEFAULT_TABLE_ARGS,) __tablename__ = TABLE_EVENT_DATA data_id: Mapped[int] = mapped_column(Integer, Identity(), primary_key=True) hash: Mapped[int | None] = mapped_column(BigInteger, index=True) @@ -309,7 +316,7 @@ class States(Base): # Used for fetching the state of entities at a specific time # (get_states in history.py) Index(ENTITY_ID_LAST_UPDATED_INDEX_TS, "entity_id", "last_updated_ts"), - {"mysql_default_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"}, + _DEFAULT_TABLE_ARGS, ) __tablename__ = TABLE_STATES state_id: Mapped[int] = mapped_column(Integer, Identity(), primary_key=True) @@ -440,9 +447,7 @@ class States(Base): class StateAttributes(Base): """State attribute change history.""" - __table_args__ = ( - {"mysql_default_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"}, - ) + __table_args__ = (_DEFAULT_TABLE_ARGS,) __tablename__ = TABLE_STATE_ATTRIBUTES attributes_id: Mapped[int] = mapped_column(Integer, Identity(), primary_key=True) hash: Mapped[int | None] = mapped_column(BigInteger, index=True) @@ -611,9 +616,7 @@ class StatisticsShortTerm(Base, StatisticsBase): class StatisticsMeta(Base): """Statistics meta data.""" - __table_args__ = ( - {"mysql_default_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"}, - ) + __table_args__ = (_DEFAULT_TABLE_ARGS,) __tablename__ = TABLE_STATISTICS_META id: Mapped[int] = mapped_column(Integer, Identity(), primary_key=True) statistic_id: Mapped[str | None] = mapped_column(