Fix recorder Oracle DB models (#55564)
* Fix recorder models for Oracle DB * Fix StatisticsRuns * Update migration for Oracle Identity columns. * Update migration logic Migration to schema version 22 done only for engine dialect oracle * Add missing table check in schema 22 migration
This commit is contained in:
parent
20ddd092f6
commit
b9ffd74db5
2 changed files with 35 additions and 5 deletions
|
@ -20,6 +20,7 @@ from .models import (
|
||||||
Statistics,
|
Statistics,
|
||||||
StatisticsMeta,
|
StatisticsMeta,
|
||||||
StatisticsRuns,
|
StatisticsRuns,
|
||||||
|
StatisticsShortTerm,
|
||||||
)
|
)
|
||||||
from .statistics import get_start_time
|
from .statistics import get_start_time
|
||||||
from .util import session_scope
|
from .util import session_scope
|
||||||
|
@ -484,7 +485,7 @@ def _apply_update(engine, session, new_version, old_version): # noqa: C901
|
||||||
session.add(StatisticsRuns(start=get_start_time()))
|
session.add(StatisticsRuns(start=get_start_time()))
|
||||||
elif new_version == 20:
|
elif new_version == 20:
|
||||||
# This changed the precision of statistics from float to double
|
# This changed the precision of statistics from float to double
|
||||||
if engine.dialect.name in ["mysql", "oracle", "postgresql"]:
|
if engine.dialect.name in ["mysql", "postgresql"]:
|
||||||
_modify_columns(
|
_modify_columns(
|
||||||
connection,
|
connection,
|
||||||
engine,
|
engine,
|
||||||
|
@ -513,6 +514,35 @@ def _apply_update(engine, session, new_version, old_version): # noqa: C901
|
||||||
"CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
|
"CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
elif new_version == 22:
|
||||||
|
# Recreate the all statistics tables for Oracle DB with Identity columns
|
||||||
|
#
|
||||||
|
# Order matters! Statistics has a relation with StatisticsMeta,
|
||||||
|
# so statistics need to be deleted before meta (or in pair depending
|
||||||
|
# on the SQL backend); and meta needs to be created before statistics.
|
||||||
|
if engine.dialect.name == "oracle":
|
||||||
|
if (
|
||||||
|
sqlalchemy.inspect(engine).has_table(StatisticsMeta.__tablename__)
|
||||||
|
or sqlalchemy.inspect(engine).has_table(Statistics.__tablename__)
|
||||||
|
or sqlalchemy.inspect(engine).has_table(StatisticsRuns.__tablename__)
|
||||||
|
or sqlalchemy.inspect(engine).has_table(
|
||||||
|
StatisticsShortTerm.__tablename__
|
||||||
|
)
|
||||||
|
):
|
||||||
|
Base.metadata.drop_all(
|
||||||
|
bind=engine,
|
||||||
|
tables=[
|
||||||
|
StatisticsShortTerm.__table__,
|
||||||
|
Statistics.__table__,
|
||||||
|
StatisticsMeta.__table__,
|
||||||
|
StatisticsRuns.__table__,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
StatisticsRuns.__table__.create(engine)
|
||||||
|
StatisticsMeta.__table__.create(engine)
|
||||||
|
StatisticsShortTerm.__table__.create(engine)
|
||||||
|
Statistics.__table__.create(engine)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"No schema migration defined for version {new_version}")
|
raise ValueError(f"No schema migration defined for version {new_version}")
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ import homeassistant.util.dt as dt_util
|
||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|
||||||
SCHEMA_VERSION = 21
|
SCHEMA_VERSION = 22
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -238,7 +238,7 @@ class StatisticData(TypedDict, total=False):
|
||||||
class StatisticsBase:
|
class StatisticsBase:
|
||||||
"""Statistics base class."""
|
"""Statistics base class."""
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, Identity(), primary_key=True)
|
||||||
created = Column(DATETIME_TYPE, default=dt_util.utcnow)
|
created = Column(DATETIME_TYPE, default=dt_util.utcnow)
|
||||||
|
|
||||||
@declared_attr
|
@declared_attr
|
||||||
|
@ -309,7 +309,7 @@ class StatisticsMeta(Base): # type: ignore
|
||||||
{"mysql_default_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"},
|
{"mysql_default_charset": "utf8mb4", "mysql_collate": "utf8mb4_unicode_ci"},
|
||||||
)
|
)
|
||||||
__tablename__ = TABLE_STATISTICS_META
|
__tablename__ = TABLE_STATISTICS_META
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, Identity(), primary_key=True)
|
||||||
statistic_id = Column(String(255), index=True)
|
statistic_id = Column(String(255), index=True)
|
||||||
source = Column(String(32))
|
source = Column(String(32))
|
||||||
unit_of_measurement = Column(String(255))
|
unit_of_measurement = Column(String(255))
|
||||||
|
@ -406,7 +406,7 @@ class StatisticsRuns(Base): # type: ignore
|
||||||
"""Representation of statistics run."""
|
"""Representation of statistics run."""
|
||||||
|
|
||||||
__tablename__ = TABLE_STATISTICS_RUNS
|
__tablename__ = TABLE_STATISTICS_RUNS
|
||||||
run_id = Column(Integer, primary_key=True)
|
run_id = Column(Integer, Identity(), primary_key=True)
|
||||||
start = Column(DateTime(timezone=True))
|
start = Column(DateTime(timezone=True))
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
|
|
Loading…
Add table
Reference in a new issue