diff --git a/homeassistant/components/recorder/migration.py b/homeassistant/components/recorder/migration.py index 508476e0c2b..fe3e1aeb84d 100644 --- a/homeassistant/components/recorder/migration.py +++ b/homeassistant/components/recorder/migration.py @@ -12,6 +12,7 @@ from sqlalchemy.exc import ( SQLAlchemyError, ) from sqlalchemy.schema import AddConstraint, DropConstraint +from sqlalchemy.sql.expression import true from .models import ( SCHEMA_VERSION, @@ -24,7 +25,7 @@ from .models import ( StatisticsShortTerm, process_timestamp, ) -from .statistics import get_metadata_with_session, get_start_time +from .statistics import get_start_time from .util import session_scope _LOGGER = logging.getLogger(__name__) @@ -558,21 +559,25 @@ def _apply_update(instance, session, new_version, old_version): # noqa: C901 session.add(StatisticsRuns(start=fake_start_time)) fake_start_time += timedelta(minutes=5) - # Copy last hourly statistic to the newly created 5-minute statistics table - sum_statistics = get_metadata_with_session( - instance.hass, session, statistic_type="sum" - ) - for metadata_id, _ in sum_statistics.values(): + # When querying the database, be careful to only explicitly query for columns + # which were present in schema version 21. If querying the table, SQLAlchemy + # will refer to future columns. + for sum_statistic in session.query(StatisticsMeta.id).filter_by(has_sum=true()): last_statistic = ( - session.query(Statistics) - .filter_by(metadata_id=metadata_id) + session.query( + Statistics.start, + Statistics.last_reset, + Statistics.state, + Statistics.sum, + ) + .filter_by(metadata_id=sum_statistic.id) .order_by(Statistics.start.desc()) .first() ) if last_statistic: session.add( StatisticsShortTerm( - metadata_id=last_statistic.metadata_id, + metadata_id=sum_statistic.id, start=last_statistic.start, last_reset=last_statistic.last_reset, state=last_statistic.state,