diff --git a/homeassistant/components/sql/__init__.py b/homeassistant/components/sql/__init__.py index 33ed64be2bf..cb026565cdd 100644 --- a/homeassistant/components/sql/__init__.py +++ b/homeassistant/components/sql/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations import logging +from typing import Any import sqlparse import voluptuous as vol @@ -32,7 +33,13 @@ from homeassistant.helpers.trigger_template_entity import ( ) from homeassistant.helpers.typing import ConfigType -from .const import CONF_COLUMN_NAME, CONF_QUERY, DOMAIN, PLATFORMS +from .const import ( + CONF_ADVANCED_OPTIONS, + CONF_COLUMN_NAME, + CONF_QUERY, + DOMAIN, + PLATFORMS, +) from .util import redact_credentials _LOGGER = logging.getLogger(__name__) @@ -75,18 +82,6 @@ CONFIG_SCHEMA = vol.Schema( ) -def remove_configured_db_url_if_not_needed( - hass: HomeAssistant, entry: ConfigEntry -) -> None: - """Remove db url from config if it matches recorder database.""" - hass.config_entries.async_update_entry( - entry, - options={ - key: value for key, value in entry.options.items() if key != CONF_DB_URL - }, - ) - - async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up SQL from yaml config.""" if (conf := config.get(DOMAIN)) is None: @@ -107,8 +102,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: redact_credentials(entry.options.get(CONF_DB_URL)), redact_credentials(get_instance(hass).db_url), ) - if entry.options.get(CONF_DB_URL) == get_instance(hass).db_url: - remove_configured_db_url_if_not_needed(hass, entry) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) @@ -119,3 +112,45 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload SQL config entry.""" return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) + + +async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + """Migrate old entry.""" + _LOGGER.debug("Migrating from version %s.%s", entry.version, entry.minor_version) + + if entry.version > 1: + # This means the user has downgraded from a future version + return False + + if entry.version == 1: + old_options = {**entry.options} + new_data = {} + new_options: dict[str, Any] = {} + + if (db_url := old_options.get(CONF_DB_URL)) != get_instance(hass).db_url: + new_data[CONF_DB_URL] = db_url + + new_options[CONF_COLUMN_NAME] = old_options.get(CONF_COLUMN_NAME) + new_options[CONF_QUERY] = old_options.get(CONF_QUERY) + new_options[CONF_ADVANCED_OPTIONS] = {} + + for key in ( + CONF_VALUE_TEMPLATE, + CONF_UNIT_OF_MEASUREMENT, + CONF_DEVICE_CLASS, + CONF_STATE_CLASS, + ): + if (value := old_options.get(key)) is not None: + new_options[CONF_ADVANCED_OPTIONS][key] = value + + hass.config_entries.async_update_entry( + entry, data=new_data, options=new_options, version=2 + ) + + _LOGGER.debug( + "Migration to version %s.%s successful", + entry.version, + entry.minor_version, + ) + + return True diff --git a/homeassistant/components/sql/config_flow.py b/homeassistant/components/sql/config_flow.py index 434cccf021f..a07b0d21da0 100644 --- a/homeassistant/components/sql/config_flow.py +++ b/homeassistant/components/sql/config_flow.py @@ -161,7 +161,7 @@ def validate_query(db_url: str, query: str, column: str) -> bool: class SQLConfigFlow(ConfigFlow, domain=DOMAIN): """Handle a config flow for SQL integration.""" - VERSION = 1 + VERSION = 2 data: dict[str, Any] diff --git a/tests/components/sql/test_config_flow.py b/tests/components/sql/test_config_flow.py index 6007abd13d0..863e87b5eae 100644 --- a/tests/components/sql/test_config_flow.py +++ b/tests/components/sql/test_config_flow.py @@ -321,6 +321,7 @@ async def test_options_flow(hass: HomeAssistant) -> None: CONF_STATE_CLASS: SensorStateClass.TOTAL, }, }, + version=2, ) entry.add_to_hass(hass) @@ -371,6 +372,7 @@ async def test_options_flow_name_previously_removed(hass: HomeAssistant) -> None CONF_UNIT_OF_MEASUREMENT: "MiB", }, }, + version=2, title="Get Value Title", ) entry.add_to_hass(hass) @@ -417,6 +419,7 @@ async def test_options_flow_fails_db_url(hass: HomeAssistant) -> None: CONF_UNIT_OF_MEASUREMENT: "MiB", }, }, + version=2, ) entry.add_to_hass(hass) @@ -455,6 +458,7 @@ async def test_options_flow_fails_invalid_query(hass: HomeAssistant) -> None: CONF_UNIT_OF_MEASUREMENT: "MiB", }, }, + version=2, ) entry.add_to_hass(hass) @@ -556,6 +560,7 @@ async def test_options_flow_fails_invalid_column_name(hass: HomeAssistant) -> No CONF_UNIT_OF_MEASUREMENT: "MiB", }, }, + version=2, ) entry.add_to_hass(hass) @@ -607,6 +612,7 @@ async def test_options_flow_db_url_empty(hass: HomeAssistant) -> None: CONF_UNIT_OF_MEASUREMENT: "MiB", }, }, + version=2, ) entry.add_to_hass(hass) @@ -722,6 +728,7 @@ async def test_device_state_class(hass: HomeAssistant) -> None: CONF_UNIT_OF_MEASUREMENT: "MiB", }, }, + version=2, ) entry.add_to_hass(hass)