mysql: ```sql /*M!999999\- enable the sandbox mode */ -- MariaDB dump 10.19-12.1.2-MariaDB, for debian-linux-gnu (x86_64) -- -- Host: localhost Database: homeassistant -- ------------------------------------------------------ -- Server version 12.1.2-MariaDB-ubu2404 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; -- -- Table structure for table `event_data` -- DROP TABLE IF EXISTS `event_data`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `event_data` ( `data_id` bigint(20) NOT NULL AUTO_INCREMENT, `hash` int(10) unsigned DEFAULT NULL, `shared_data` longtext DEFAULT NULL, PRIMARY KEY (`data_id`), KEY `ix_event_data_hash` (`hash`) ) ENGINE=InnoDB AUTO_INCREMENT=91 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `event_types` -- DROP TABLE IF EXISTS `event_types`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `event_types` ( `event_type_id` bigint(20) NOT NULL AUTO_INCREMENT, `event_type` varchar(64) DEFAULT NULL, PRIMARY KEY (`event_type_id`), UNIQUE KEY `ix_event_types_event_type` (`event_type`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `events` -- DROP TABLE IF EXISTS `events`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `events` ( `event_id` bigint(20) NOT NULL AUTO_INCREMENT, `event_type` char(0) DEFAULT NULL, `event_data` char(0) DEFAULT NULL, `origin` char(0) DEFAULT NULL, `origin_idx` smallint(6) DEFAULT NULL, `time_fired` char(0) DEFAULT NULL, `time_fired_ts` double DEFAULT NULL, `context_id` char(0) DEFAULT NULL, `context_user_id` char(0) DEFAULT NULL, `context_parent_id` char(0) DEFAULT NULL, `data_id` bigint(20) DEFAULT NULL, `context_id_bin` tinyblob DEFAULT NULL, `context_user_id_bin` tinyblob DEFAULT NULL, `context_parent_id_bin` tinyblob DEFAULT NULL, `event_type_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`event_id`), KEY `ix_events_context_id_bin` (`context_id_bin`(16)), KEY `ix_events_time_fired_ts` (`time_fired_ts`), KEY `ix_events_event_type_id_time_fired_ts` (`event_type_id`,`time_fired_ts`), KEY `ix_events_data_id` (`data_id`), CONSTRAINT `1` FOREIGN KEY (`data_id`) REFERENCES `event_data` (`data_id`), CONSTRAINT `2` FOREIGN KEY (`event_type_id`) REFERENCES `event_types` (`event_type_id`) ) ENGINE=InnoDB AUTO_INCREMENT=183 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `migration_changes` -- DROP TABLE IF EXISTS `migration_changes`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `migration_changes` ( `migration_id` varchar(255) NOT NULL, `version` smallint(6) NOT NULL, PRIMARY KEY (`migration_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `recorder_runs` -- DROP TABLE IF EXISTS `recorder_runs`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `recorder_runs` ( `run_id` bigint(20) NOT NULL AUTO_INCREMENT, `start` datetime(6) NOT NULL, `end` datetime(6) DEFAULT NULL, `closed_incorrect` tinyint(1) NOT NULL, `created` datetime(6) NOT NULL, PRIMARY KEY (`run_id`), KEY `ix_recorder_runs_start_end` (`start`,`end`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `schema_changes` -- DROP TABLE IF EXISTS `schema_changes`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `schema_changes` ( `change_id` bigint(20) NOT NULL AUTO_INCREMENT, `schema_version` int(11) DEFAULT NULL, `changed` datetime(6) NOT NULL, PRIMARY KEY (`change_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `state_attributes` -- DROP TABLE IF EXISTS `state_attributes`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `state_attributes` ( `attributes_id` bigint(20) NOT NULL AUTO_INCREMENT, `hash` int(10) unsigned DEFAULT NULL, `shared_attrs` longtext DEFAULT NULL, PRIMARY KEY (`attributes_id`), KEY `ix_state_attributes_hash` (`hash`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `states` -- DROP TABLE IF EXISTS `states`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `states` ( `state_id` bigint(20) NOT NULL AUTO_INCREMENT, `entity_id` char(0) DEFAULT NULL, `state` varchar(255) DEFAULT NULL, `attributes` char(0) DEFAULT NULL, `event_id` smallint(6) DEFAULT NULL, `last_changed` char(0) DEFAULT NULL, `last_changed_ts` double DEFAULT NULL, `last_reported_ts` double DEFAULT NULL, `last_updated` char(0) DEFAULT NULL, `last_updated_ts` double DEFAULT NULL, `old_state_id` bigint(20) DEFAULT NULL, `attributes_id` bigint(20) DEFAULT NULL, `context_id` char(0) DEFAULT NULL, `context_user_id` char(0) DEFAULT NULL, `context_parent_id` char(0) DEFAULT NULL, `origin_idx` smallint(6) DEFAULT NULL, `context_id_bin` tinyblob DEFAULT NULL, `context_user_id_bin` tinyblob DEFAULT NULL, `context_parent_id_bin` tinyblob DEFAULT NULL, `metadata_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`state_id`), KEY `ix_states_attributes_id` (`attributes_id`), KEY `ix_states_last_updated_ts` (`last_updated_ts`), KEY `ix_states_context_id_bin` (`context_id_bin`(16)), KEY `ix_states_metadata_id_last_updated_ts` (`metadata_id`,`last_updated_ts`), KEY `ix_states_old_state_id` (`old_state_id`), CONSTRAINT `1` FOREIGN KEY (`old_state_id`) REFERENCES `states` (`state_id`), CONSTRAINT `2` FOREIGN KEY (`attributes_id`) REFERENCES `state_attributes` (`attributes_id`), CONSTRAINT `3` FOREIGN KEY (`metadata_id`) REFERENCES `states_meta` (`metadata_id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `states_meta` -- DROP TABLE IF EXISTS `states_meta`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `states_meta` ( `metadata_id` bigint(20) NOT NULL AUTO_INCREMENT, `entity_id` varchar(255) DEFAULT NULL, PRIMARY KEY (`metadata_id`), UNIQUE KEY `ix_states_meta_entity_id` (`entity_id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `statistics` -- DROP TABLE IF EXISTS `statistics`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `statistics` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `created` char(0) DEFAULT NULL, `created_ts` double DEFAULT NULL, `metadata_id` bigint(20) DEFAULT NULL, `start` char(0) DEFAULT NULL, `start_ts` double DEFAULT NULL, `mean` double DEFAULT NULL, `mean_weight` double DEFAULT NULL, `min` double DEFAULT NULL, `max` double DEFAULT NULL, `last_reset` char(0) DEFAULT NULL, `last_reset_ts` double DEFAULT NULL, `state` double DEFAULT NULL, `sum` double DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ix_statistics_statistic_id_start_ts` (`metadata_id`,`start_ts`), KEY `ix_statistics_start_ts` (`start_ts`), CONSTRAINT `1` FOREIGN KEY (`metadata_id`) REFERENCES `statistics_meta` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `statistics_meta` -- DROP TABLE IF EXISTS `statistics_meta`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `statistics_meta` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `statistic_id` varchar(255) DEFAULT NULL, `source` varchar(32) DEFAULT NULL, `unit_of_measurement` varchar(255) DEFAULT NULL, `unit_class` varchar(255) DEFAULT NULL, `has_mean` tinyint(1) DEFAULT NULL, `has_sum` tinyint(1) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `mean_type` smallint(6) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ix_statistics_meta_statistic_id` (`statistic_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `statistics_runs` -- DROP TABLE IF EXISTS `statistics_runs`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `statistics_runs` ( `run_id` bigint(20) NOT NULL AUTO_INCREMENT, `start` datetime(6) NOT NULL, PRIMARY KEY (`run_id`), KEY `ix_statistics_runs_start` (`start`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `statistics_short_term` -- DROP TABLE IF EXISTS `statistics_short_term`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `statistics_short_term` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `created` char(0) DEFAULT NULL, `created_ts` double DEFAULT NULL, `metadata_id` bigint(20) DEFAULT NULL, `start` char(0) DEFAULT NULL, `start_ts` double DEFAULT NULL, `mean` double DEFAULT NULL, `mean_weight` double DEFAULT NULL, `min` double DEFAULT NULL, `max` double DEFAULT NULL, `last_reset` char(0) DEFAULT NULL, `last_reset_ts` double DEFAULT NULL, `state` double DEFAULT NULL, `sum` double DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ix_statistics_short_term_statistic_id_start_ts` (`metadata_id`,`start_ts`), KEY `ix_statistics_short_term_start_ts` (`start_ts`), CONSTRAINT `1` FOREIGN KEY (`metadata_id`) REFERENCES `statistics_meta` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; -- Dump completed on 2025-12-08 14:28:27 ``` postgresql: ```sql -- -- PostgreSQL database dump -- \restrict 9zFMerZ7o6L03AnfBUNASNm8ofDuUqBhBkWGUYVYq1dGJZ5sz9TULNvRDy8ig5C -- Dumped from database version 17.7 (Debian 17.7-3.pgdg13+1) -- Dumped by pg_dump version 17.7 (Debian 17.7-3.pgdg13+1) SET statement_timeout = 0; SET lock_timeout = 0; SET idle_in_transaction_session_timeout = 0; SET transaction_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; SELECT pg_catalog.set_config('search_path', '', false); SET check_function_bodies = false; SET xmloption = content; SET client_min_messages = warning; SET row_security = off; SET default_tablespace = ''; SET default_table_access_method = heap; -- -- Name: event_data; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.event_data ( data_id bigint NOT NULL, hash bigint, shared_data text ); ALTER TABLE public.event_data OWNER TO homeassistant; -- -- Name: event_data_data_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.event_data ALTER COLUMN data_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.event_data_data_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: event_types; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.event_types ( event_type_id bigint NOT NULL, event_type character varying(64) ); ALTER TABLE public.event_types OWNER TO homeassistant; -- -- Name: event_types_event_type_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.event_types ALTER COLUMN event_type_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.event_types_event_type_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: events; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.events ( event_id bigint NOT NULL, event_type character(1), event_data character(1), origin character(1), origin_idx smallint, time_fired timestamp with time zone, time_fired_ts double precision, context_id character(1), context_user_id character(1), context_parent_id character(1), data_id bigint, context_id_bin bytea, context_user_id_bin bytea, context_parent_id_bin bytea, event_type_id bigint ); ALTER TABLE public.events OWNER TO homeassistant; -- -- Name: events_event_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.events ALTER COLUMN event_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.events_event_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: migration_changes; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.migration_changes ( migration_id character varying(255) NOT NULL, version smallint NOT NULL ); ALTER TABLE public.migration_changes OWNER TO homeassistant; -- -- Name: recorder_runs; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.recorder_runs ( run_id bigint NOT NULL, start timestamp with time zone NOT NULL, "end" timestamp with time zone, closed_incorrect boolean NOT NULL, created timestamp with time zone NOT NULL ); ALTER TABLE public.recorder_runs OWNER TO homeassistant; -- -- Name: recorder_runs_run_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.recorder_runs ALTER COLUMN run_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.recorder_runs_run_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: schema_changes; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.schema_changes ( change_id bigint NOT NULL, schema_version integer, changed timestamp with time zone NOT NULL ); ALTER TABLE public.schema_changes OWNER TO homeassistant; -- -- Name: schema_changes_change_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.schema_changes ALTER COLUMN change_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.schema_changes_change_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: state_attributes; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.state_attributes ( attributes_id bigint NOT NULL, hash bigint, shared_attrs text ); ALTER TABLE public.state_attributes OWNER TO homeassistant; -- -- Name: state_attributes_attributes_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.state_attributes ALTER COLUMN attributes_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.state_attributes_attributes_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: states; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.states ( state_id bigint NOT NULL, entity_id character(1), state character varying(255), attributes character(1), event_id smallint, last_changed timestamp with time zone, last_changed_ts double precision, last_reported_ts double precision, last_updated timestamp with time zone, last_updated_ts double precision, old_state_id bigint, attributes_id bigint, context_id character(1), context_user_id character(1), context_parent_id character(1), origin_idx smallint, context_id_bin bytea, context_user_id_bin bytea, context_parent_id_bin bytea, metadata_id bigint ); ALTER TABLE public.states OWNER TO homeassistant; -- -- Name: states_meta; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.states_meta ( metadata_id bigint NOT NULL, entity_id character varying(255) ); ALTER TABLE public.states_meta OWNER TO homeassistant; -- -- Name: states_meta_metadata_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.states_meta ALTER COLUMN metadata_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.states_meta_metadata_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: states_state_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.states ALTER COLUMN state_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.states_state_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: statistics; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.statistics ( id bigint NOT NULL, created timestamp with time zone, created_ts double precision, metadata_id bigint, start timestamp with time zone, start_ts double precision, mean double precision, mean_weight double precision, min double precision, max double precision, last_reset timestamp with time zone, last_reset_ts double precision, state double precision, sum double precision ); ALTER TABLE public.statistics OWNER TO homeassistant; -- -- Name: statistics_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.statistics ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.statistics_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: statistics_meta; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.statistics_meta ( id bigint NOT NULL, statistic_id character varying(255), source character varying(32), unit_of_measurement character varying(255), unit_class character varying(255), has_mean boolean, has_sum boolean, name character varying(255), mean_type smallint NOT NULL ); ALTER TABLE public.statistics_meta OWNER TO homeassistant; -- -- Name: statistics_meta_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.statistics_meta ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.statistics_meta_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: statistics_runs; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.statistics_runs ( run_id bigint NOT NULL, start timestamp with time zone NOT NULL ); ALTER TABLE public.statistics_runs OWNER TO homeassistant; -- -- Name: statistics_runs_run_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.statistics_runs ALTER COLUMN run_id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.statistics_runs_run_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: statistics_short_term; Type: TABLE; Schema: public; Owner: homeassistant -- CREATE TABLE public.statistics_short_term ( id bigint NOT NULL, created timestamp with time zone, created_ts double precision, metadata_id bigint, start timestamp with time zone, start_ts double precision, mean double precision, mean_weight double precision, min double precision, max double precision, last_reset timestamp with time zone, last_reset_ts double precision, state double precision, sum double precision ); ALTER TABLE public.statistics_short_term OWNER TO homeassistant; -- -- Name: statistics_short_term_id_seq; Type: SEQUENCE; Schema: public; Owner: homeassistant -- ALTER TABLE public.statistics_short_term ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( SEQUENCE NAME public.statistics_short_term_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1 ); -- -- Name: event_data event_data_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.event_data ADD CONSTRAINT event_data_pkey PRIMARY KEY (data_id); -- -- Name: event_types event_types_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.event_types ADD CONSTRAINT event_types_pkey PRIMARY KEY (event_type_id); -- -- Name: events events_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.events ADD CONSTRAINT events_pkey PRIMARY KEY (event_id); -- -- Name: migration_changes migration_changes_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.migration_changes ADD CONSTRAINT migration_changes_pkey PRIMARY KEY (migration_id); -- -- Name: recorder_runs recorder_runs_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.recorder_runs ADD CONSTRAINT recorder_runs_pkey PRIMARY KEY (run_id); -- -- Name: schema_changes schema_changes_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.schema_changes ADD CONSTRAINT schema_changes_pkey PRIMARY KEY (change_id); -- -- Name: state_attributes state_attributes_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.state_attributes ADD CONSTRAINT state_attributes_pkey PRIMARY KEY (attributes_id); -- -- Name: states_meta states_meta_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.states_meta ADD CONSTRAINT states_meta_pkey PRIMARY KEY (metadata_id); -- -- Name: states states_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.states ADD CONSTRAINT states_pkey PRIMARY KEY (state_id); -- -- Name: statistics_meta statistics_meta_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.statistics_meta ADD CONSTRAINT statistics_meta_pkey PRIMARY KEY (id); -- -- Name: statistics statistics_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.statistics ADD CONSTRAINT statistics_pkey PRIMARY KEY (id); -- -- Name: statistics_runs statistics_runs_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.statistics_runs ADD CONSTRAINT statistics_runs_pkey PRIMARY KEY (run_id); -- -- Name: statistics_short_term statistics_short_term_pkey; Type: CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.statistics_short_term ADD CONSTRAINT statistics_short_term_pkey PRIMARY KEY (id); -- -- Name: ix_event_data_hash; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_event_data_hash ON public.event_data USING btree (hash); -- -- Name: ix_event_types_event_type; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE UNIQUE INDEX ix_event_types_event_type ON public.event_types USING btree (event_type); -- -- Name: ix_events_context_id_bin; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_events_context_id_bin ON public.events USING btree (context_id_bin); -- -- Name: ix_events_data_id; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_events_data_id ON public.events USING btree (data_id); -- -- Name: ix_events_event_type_id_time_fired_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_events_event_type_id_time_fired_ts ON public.events USING btree (event_type_id, time_fired_ts); -- -- Name: ix_events_time_fired_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_events_time_fired_ts ON public.events USING btree (time_fired_ts); -- -- Name: ix_recorder_runs_start_end; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_recorder_runs_start_end ON public.recorder_runs USING btree (start, "end"); -- -- Name: ix_state_attributes_hash; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_state_attributes_hash ON public.state_attributes USING btree (hash); -- -- Name: ix_states_attributes_id; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_states_attributes_id ON public.states USING btree (attributes_id); -- -- Name: ix_states_context_id_bin; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_states_context_id_bin ON public.states USING btree (context_id_bin); -- -- Name: ix_states_last_updated_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_states_last_updated_ts ON public.states USING btree (last_updated_ts); -- -- Name: ix_states_meta_entity_id; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE UNIQUE INDEX ix_states_meta_entity_id ON public.states_meta USING btree (entity_id); -- -- Name: ix_states_metadata_id_last_updated_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_states_metadata_id_last_updated_ts ON public.states USING btree (metadata_id, last_updated_ts); -- -- Name: ix_states_old_state_id; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_states_old_state_id ON public.states USING btree (old_state_id); -- -- Name: ix_statistics_meta_statistic_id; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE UNIQUE INDEX ix_statistics_meta_statistic_id ON public.statistics_meta USING btree (statistic_id); -- -- Name: ix_statistics_runs_start; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_statistics_runs_start ON public.statistics_runs USING btree (start); -- -- Name: ix_statistics_short_term_start_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_statistics_short_term_start_ts ON public.statistics_short_term USING btree (start_ts); -- -- Name: ix_statistics_short_term_statistic_id_start_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE UNIQUE INDEX ix_statistics_short_term_statistic_id_start_ts ON public.statistics_short_term USING btree (metadata_id, start_ts); -- -- Name: ix_statistics_start_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE INDEX ix_statistics_start_ts ON public.statistics USING btree (start_ts); -- -- Name: ix_statistics_statistic_id_start_ts; Type: INDEX; Schema: public; Owner: homeassistant -- CREATE UNIQUE INDEX ix_statistics_statistic_id_start_ts ON public.statistics USING btree (metadata_id, start_ts); -- -- Name: events events_data_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.events ADD CONSTRAINT events_data_id_fkey FOREIGN KEY (data_id) REFERENCES public.event_data(data_id); -- -- Name: events events_event_type_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.events ADD CONSTRAINT events_event_type_id_fkey FOREIGN KEY (event_type_id) REFERENCES public.event_types(event_type_id); -- -- Name: states states_attributes_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.states ADD CONSTRAINT states_attributes_id_fkey FOREIGN KEY (attributes_id) REFERENCES public.state_attributes(attributes_id); -- -- Name: states states_metadata_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.states ADD CONSTRAINT states_metadata_id_fkey FOREIGN KEY (metadata_id) REFERENCES public.states_meta(metadata_id); -- -- Name: states states_old_state_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.states ADD CONSTRAINT states_old_state_id_fkey FOREIGN KEY (old_state_id) REFERENCES public.states(state_id); -- -- Name: statistics statistics_metadata_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.statistics ADD CONSTRAINT statistics_metadata_id_fkey FOREIGN KEY (metadata_id) REFERENCES public.statistics_meta(id) ON DELETE CASCADE; -- -- Name: statistics_short_term statistics_short_term_metadata_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: homeassistant -- ALTER TABLE ONLY public.statistics_short_term ADD CONSTRAINT statistics_short_term_metadata_id_fkey FOREIGN KEY (metadata_id) REFERENCES public.statistics_meta(id) ON DELETE CASCADE; -- -- PostgreSQL database dump complete -- \unrestrict 9zFMerZ7o6L03AnfBUNASNm8ofDuUqBhBkWGUYVYq1dGJZ5sz9TULNvRDy8ig5C ``` 经过对你提供的两份 SQL 文件(MySQL 源 vs PostgreSQL 目标)的**逐行比对和逻辑推演**,我为你整理了一份最终版的“排雷清单”。 这是从 MySQL 迁移到 PostgreSQL 时,**百分之百会遇到**的具体技术障碍。如果脚本不处理这些问题,迁移一定会失败。 --- ### 🔴 第一类:致命错误 (会导致迁移直接中断) #### 1. 空字符串撞击时间戳 (`char(0)` vs `TIMESTAMP`) 这是最隐蔽也是最致命的问题。 * **位置**:`states` 表 (`last_updated`, `last_changed`), `events` 表 (`time_fired`), `statistics` 表 (`start`, `created`)。 * **MySQL 现状**:字段类型是 `char(0)`。这意味着里面存的数据全是 **空字符串 `""`**。 * **Postgres 现状**:字段类型是 `timestamp with time zone`。 * **冲突点**:Postgres 极其严格,它认为 `""` 不是一个合法的时间。 * **报错信息**:`ERROR: invalid input syntax for type timestamp: ""` * **必需对策**:脚本必须检测:如果源数据是 `""` 且目标是时间列,**强制写入 `NULL`**。 #### 2. Null 字节攻击 (`\x00` in Text) * **位置**:`state_attributes` (`shared_attrs`), `event_data` (`shared_data`)。 * **MySQL 现状**:`LONGTEXT` 类型。MySQL 允许文本中包含二进制 `\0` (Null Byte) 字符。 * **Postgres 现状**:`TEXT` 类型。Postgres 的 Text 类型底层是 C 语言字符串,**严禁**包含 `\0`,否则会截断或报错。 * **冲突点**:如果你的某个智能家居设备(比如乱码的 Zigbee 设备)上报过含有特殊字符的数据,迁移到这就挂了。 * **报错信息**:`ERROR: invalid byte sequence for encoding "UTF8": 0x00` * **必需对策**:Python 脚本在读取字符串后,必须执行 `.replace('\0', '')` 清洗数据。 #### 3. 布尔值类型不匹配 * **位置**:`recorder_runs` (`closed_incorrect`), `statistics_meta` (`has_mean`, `has_sum`)。 * **MySQL 现状**:`tinyint(1)`,存储 `0` 或 `1`。 * **Postgres 现状**:`boolean`,存储 `false` 或 `true`。 * **冲突点**:虽然部分驱动能转换,但在使用 `COPY` 或严格 SQL 模式时,直接插入整数 `1` 到布尔字段会失败。 * **报错信息**:`column "xxx" is of type boolean but expression is of type integer` * **必需对策**:脚本必须显式将 `0/1` 转换为 Python 的 `False/True` 对象。 --- ### 🟠 第二类:逻辑隐患 (迁移能成功,但 HA 运行不正常) #### 4. 时区丢失 (Timezone Naive) * **位置**:`recorder_runs` 表的 `start` 和 `end` 字段。 * **MySQL 现状**:`datetime(6)`。这是“无时区”时间,比如 `2023-01-01 12:00:00`。 * **Postgres 现状**:`timestamp with time zone`。 * **隐患**:Postgres 收到这个时间后,会困惑“这是 UTC 还是北京时间?”。通常它会默认按服务器本地时间处理。如果你的 MySQL 里存的是 UTC(HA 默认存 UTC),而 Postgres 把它当成北京时间存进去,**时间就偏了 8 小时**。 * **表现**:历史记录图表的时间轴对不上。 * **必需对策**:脚本读取到 datetime 对象后,必须手动加上 `tzinfo=timezone.utc`。 #### 5. 自增序列未同步 (Sequence out of sync) * **位置**:所有表的主键 (`state_id`, `event_id`, `run_id` 等)。 * **MySQL 机制**:插入 `ID=1000`,下一次自动生成 `1001`。 * **Postgres 机制**:插入 `ID=1000`,序列生成器(Sequence)**不会**自动跳到 1000,它可能还在 `1`。 * **隐患**:迁移完几百万条数据后,HA 启动,试图插入一条新状态,Postgres 分配 `ID=2`,结果数据库里已经有 `ID=2` 了。 * **报错信息**:`duplicate key value violates unique constraint` * **必需对策**:迁移结束后,必须运行 `setval` SQL 命令,重置所有序列。 --- ### 🟢 第三类:无需担心的差异 (自动兼容) 以下差异在你的 SQL 文件中存在,但**不会**导致问题,脚本可以直接处理: 1. **整数精度**: * MySQL `int(10) unsigned` (Hash值) -> Postgres `bigint`。 * **结论**:安全。`bigint` 范围比 `int unsigned` 大,直接存没问题。 2. **双精度时间戳**: * MySQL `double` (`_ts` 字段) -> Postgres `double precision`。 * **结论**:安全。这是纯数字,不涉及编码和时区,直接复制。 3. **废弃字段的字符长度**: * MySQL `entity_id char(0)` -> Postgres `entity_id character(1)`。 * **结论**:安全。MySQL 里的 `NULL` 或 `""` 都可以存入 Postgres 的 `character(1)`(只要脚本把空串处理为 NULL 最好,或者存入空串也没问题,因为 Postgres 的 char(1) 能存空串)。 --- ### 📝 最终结论 你不需要手动修改 SQL,也不需要担心这些差异。 我之前提供的 **`migrate_ha_final.py`** 脚本,是基于上述所有“坑”编写的。它内置了以下逻辑闭环: 1. `clean_value` 函数:专门拦截 `char(0)` 变 `NULL`。 2. `clean_value` 函数:专门清洗 `\0`。 3. `clean_value` 函数:专门附加 UTC 时区。 4. 脚本末尾:专门执行 `setval` 修复序列。 **你可以放心使用该脚本进行迁移。**