mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Execute sql queries in the database executor when using the recorder database (#89673)
This commit is contained in:
parent
dbc0890ce8
commit
03b204f445
@ -10,7 +10,7 @@ from sqlalchemy.engine import Result
|
|||||||
from sqlalchemy.exc import SQLAlchemyError
|
from sqlalchemy.exc import SQLAlchemyError
|
||||||
from sqlalchemy.orm import Session, scoped_session, sessionmaker
|
from sqlalchemy.orm import Session, scoped_session, sessionmaker
|
||||||
|
|
||||||
from homeassistant.components.recorder import CONF_DB_URL
|
from homeassistant.components.recorder import CONF_DB_URL, get_instance
|
||||||
from homeassistant.components.sensor import (
|
from homeassistant.components.sensor import (
|
||||||
CONF_STATE_CLASS,
|
CONF_STATE_CLASS,
|
||||||
SensorDeviceClass,
|
SensorDeviceClass,
|
||||||
@ -136,7 +136,6 @@ async def async_setup_sensor(
|
|||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up the SQL sensor."""
|
"""Set up the SQL sensor."""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
engine = sqlalchemy.create_engine(db_url, future=True)
|
engine = sqlalchemy.create_engine(db_url, future=True)
|
||||||
sessmaker = scoped_session(sessionmaker(bind=engine, future=True))
|
sessmaker = scoped_session(sessionmaker(bind=engine, future=True))
|
||||||
@ -163,6 +162,8 @@ async def async_setup_sensor(
|
|||||||
else:
|
else:
|
||||||
query_str = query_str.replace(";", "") + " LIMIT 1;"
|
query_str = query_str.replace(";", "") + " LIMIT 1;"
|
||||||
|
|
||||||
|
use_database_executor = db_url == get_instance(hass).db_url
|
||||||
|
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
[
|
[
|
||||||
SQLSensor(
|
SQLSensor(
|
||||||
@ -176,6 +177,7 @@ async def async_setup_sensor(
|
|||||||
yaml,
|
yaml,
|
||||||
device_class,
|
device_class,
|
||||||
state_class,
|
state_class,
|
||||||
|
use_database_executor,
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
True,
|
True,
|
||||||
@ -200,6 +202,7 @@ class SQLSensor(SensorEntity):
|
|||||||
yaml: bool,
|
yaml: bool,
|
||||||
device_class: SensorDeviceClass | None,
|
device_class: SensorDeviceClass | None,
|
||||||
state_class: SensorStateClass | None,
|
state_class: SensorStateClass | None,
|
||||||
|
use_database_executor: bool,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize the SQL sensor."""
|
"""Initialize the SQL sensor."""
|
||||||
self._query = query
|
self._query = query
|
||||||
@ -212,6 +215,7 @@ class SQLSensor(SensorEntity):
|
|||||||
self.sessionmaker = sessmaker
|
self.sessionmaker = sessmaker
|
||||||
self._attr_extra_state_attributes = {}
|
self._attr_extra_state_attributes = {}
|
||||||
self._attr_unique_id = unique_id
|
self._attr_unique_id = unique_id
|
||||||
|
self._use_database_executor = use_database_executor
|
||||||
if not yaml and unique_id:
|
if not yaml and unique_id:
|
||||||
self._attr_device_info = DeviceInfo(
|
self._attr_device_info = DeviceInfo(
|
||||||
entry_type=DeviceEntryType.SERVICE,
|
entry_type=DeviceEntryType.SERVICE,
|
||||||
@ -220,9 +224,15 @@ class SQLSensor(SensorEntity):
|
|||||||
name=name,
|
name=name,
|
||||||
)
|
)
|
||||||
|
|
||||||
def update(self) -> None:
|
async def async_update(self) -> None:
|
||||||
"""Retrieve sensor data from the query."""
|
"""Retrieve sensor data from the query using the right executor."""
|
||||||
|
if self._use_database_executor:
|
||||||
|
await get_instance(self.hass).async_add_executor_job(self._update)
|
||||||
|
else:
|
||||||
|
await self.hass.async_add_executor_job(self._update)
|
||||||
|
|
||||||
|
def _update(self) -> None:
|
||||||
|
"""Retrieve sensor data from the query."""
|
||||||
data = None
|
data = None
|
||||||
self._attr_extra_state_attributes = {}
|
self._attr_extra_state_attributes = {}
|
||||||
sess: scoped_session = self.sessionmaker()
|
sess: scoped_session = self.sessionmaker()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user