如何限制Home Assistant中的位置存储?

问题描述 投票:0回答:1

是否可以限制或禁用Home Assistant中的存储地理位置数据(例如

sensor.<device>_geocoded_location
)?

我不想一起禁用地理定位,因为目前(现在),我确实想知道设备位于哪里来运行基于区域的自动化。

但是,我不想保留这些数据(无论如何超过一定时间)。

sqlite geolocation home-assistant
1个回答
0
投票

您可以在形成您只希望存在 1 行的数据的相应列上创建 UNIQUE 索引,然后使用

INSERT OR IGNORE
。如果 UNIQUE 约束(规则)被破坏,则 INSERT 将被忽略。

  • INSERT OR REPLACE 将代替忽略插入更新正在插入的行(如果它不是唯一的)。

主键可以是组合(由多于 1 列组成),它隐式是唯一的,因此是索引的候选者

也许考虑以下演示,它很可能模仿您问题中的假设要求。

DROP TABLE IF EXISTS thetable;
CREATE TABLE IF NOT EXISTS the_table (
    device TEXT, 
    location_lattitude REAL, 
    location_longitude REAL, 
    other_column TEXT /* etc */, 
    PRIMARY KEY (device,location_lattitude,location_longitude) /* PRIMARY KEY IS IMPLICITLY UNIQUE */
);
INSERT OR IGNORE INTO the_table VALUES
    ('d1',100.1,200.1,'blah1'), /* WILL INSERT AS UNIQUE (row rows exist)*/
    ('d2',100.1,200.1,'blah1'), /* WILL INSERT AS UNIQUE (device is unique even though location isn't)*/
    ('d1',100.1,200.1,'blah2'), /* WILL NOT INSERT AS NOT UNIQUE (device,lat,long combination exists SEE BELOW)*/
    ('d3',100.1,200.1,'blah1'), /* WILL INSERT AS UNIQUE (device unique)*/
    ('d1',300.1,200.1,'blah1')  /* WILL INSERT AS UNIQUE (lat not unqiue)*/
;
SELECT *,rowid FROM the_table;
/* ALL insertes will be ignored */
INSERT OR IGNORE INTO the_table VALUES
    ('d1',100.1,200.1,'blah1'), /* WILL INSERT AS UNIQUE (row rows exist)*/
    ('d2',100.1,200.1,'blah10'), /* WILL INSERT AS UNIQUE (device is unique even though location isn't)*/
    ('d1',100.1,200.1,'blah20'), /* WILL NOT INSERT AS NOT UNIQUE (device,lat,long combination exists SEE BELOW)*/
    ('d3',100.1,200.1,'blah10'), /* WILL INSERT AS UNIQUE (device unique)*/
    ('d1',300.1,200.1,'blah10')  /* WILL INSERT AS UNIQUE (lat not unqiue)*/
;
SELECT *,rowid FROM the_table;
/* instead of ignoring the insert, the existing unique row is replaced with the updated/changed data */
/* i.e. ALL ROWS WILL BE UPDATED */
INSERT OR REPLACE INTO the_table VALUES
    ('d1',100.1,200.1,'blah10'), /* WILL INSERT AS UNIQUE (row rows exist)*/
    ('d2',100.1,200.1,'blah10'), /* WILL INSERT AS UNIQUE (device is unique even though location isn't)*/
    ('d1',100.1,200.1,'blah20'), /* WILL NOT INSERT AS NOT UNIQUE (device,lat,long combination exists SEE BELOW)*/
    ('d3',100.1,200.1,'blah10'), /* WILL INSERT AS UNIQUE (device unique)*/
    ('d1',300.1,200.1,'blah10')  /* WILL INSERT AS UNIQUE (lat not unqiue)*/
;
SELECT *,rowid FROM the_table;
DROP TABLE IF EXISTS the_table;

第一次插入将插入 5 个中的 4 个(请参阅 SQL 中的注释),如下所示:-

第二次插入不会更改任何内容,因为每一行都已插入,因此将与唯一主键冲突:-

  • 即唯一的区别是这是结果 2 而不是结果 1

但是,第三次插入不会插入任何行,但会更新所有行(实际上是删除和插入,因为这就是 REPLACE 的工作原理):-

可以看到 other_column 的新值已相应更改。

注意rowid。这是一个通常隐藏的列,将存在于所有普通表中(不存在于使用

WITHOUT ROWID
子句定义的表中)。除非使用别名并提供了值,否则将生成它的值。它通常比现有的最高 rowid 大 1。

结果清楚地表明rowid已经改变。这是因为 REPLACE 删除该行,然后插入另一行,从而生成另一个比现有最高 rowid 大 1 的 rowid。

  • 例如

    1. 当尝试插入第一行时,使用 OR REPLACE 时,rowid 1 被删除,然后由于 rowid 4 存在,被替换的行将被插入,rowid 为 4+1 = 5
    2. 当尝试插入第二个时,rowid 2 变为 6 (5+1)
    3. 当尝试插入第三个时,因为它与第一个冲突,则 rowid 5(最初为 1)变为 7 (6+1)
    4. 第四,rowid 3 变为 8,第五,rowid 4 变为 9
  • 这就是为什么 rowid 包含在选择中的原因。当然,rowid 经常被忽略(尽管它有时很有用)

© www.soinside.com 2019 - 2024. All rights reserved.