Consolidated 16+ top-level categories into 8 clear functional groups (AI, Development, Home-Automation, Infrastructure, Lifestyle, PKM, Professional, Backup). Merged duplicate files (OpenRouter.md, Github.md) and archived originals. This simplifies navigation and improves long-term maintainability. (vault changes by Claude Code)
1125 lines
35 KiB
Markdown
1125 lines
35 KiB
Markdown
|
||
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` 修复序列。
|
||
|
||
**你可以放心使用该脚本进行迁移。** |