Closed jddayley closed 1 year ago
Question: why did you change result in result: Result
That looks like a type hint. It's not a necessary change to get it working again. The Session
import is also not used. I have plucked out the ones that are needed, ie. the update to the parameter for sess.execute()
.
Note that 2023.3.4 bumped the requirements again to sqlalchemy==2.0.6
. I've now made it sqlalchemy~=2.0
to help with future minor bumps.
With the latest home assistant, they updated it to the latest SQLalchemy. The errors indicate changes are required to the manifest and sensor.py to support the newest version. I reviewed the updates made in the core repository and ported it over.
Below are the changes I made to your sensor.py to enable it to work.
"""Sensor from an SQL Query (with JSON to object conversion)."""
Based on: core/homeassistant/components/sql/sensor.py @ core-2021.5.1
import datetime import decimal import logging import re import json
import sqlalchemy
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.orm import Session, scoped_session, sessionmaker import voluptuous as vol
from homeassistant.components.recorder import CONF_DB_URL, DEFAULT_DB_FILE, DEFAULT_URL from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT, CONF_VALUE_TEMPLATE from homeassistant.helpers.template import Template, is_template_string import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(name)
CONF_COLUMN_NAME = "column" CONF_QUERIES = "queries" CONF_QUERY = "query"
DB_URL_RE = re.compile("//.:.@")
def redact_credentials(data): """Redact credentials from string data.""" return DB_URL_RE.sub("//:@", data)
def validate_sql_select(value): """Validate that value is a SQL SELECT query.""" if not value.lstrip().lower().startswith("select"): raise vol.Invalid("Only SELECT queries allowed") return value
_QUERY_SCHEME = vol.Schema( { vol.Required(CONF_COLUMN_NAME): cv.string, vol.Required(CONF_NAME): cv.string, vol.Required(CONF_QUERY): vol.All(cv.string, validate_sql_select), vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, vol.Optional(CONF_VALUE_TEMPLATE): cv.template, } )
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {vol.Required(CONF_QUERIES): [_QUERY_SCHEME], vol.Optional(CONF_DB_URL): cv.string} )
def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the SQL sensor platform.""" if not (db_url := config.get(CONF_DB_URL)): db_url = DEFAULT_URL.format(hass_config_path=hass.config.path(DEFAULT_DB_FILE))
class SQLSensor(SensorEntity): """Representation of an SQL sensor."""