跳到主要内容

requiredQueryCacheColumns()

function requiredQueryCacheColumns(metadata): ReadonlyMap<string, string>;

Defined in: packages/rxdb-adapter-sqlite-core/src/query-cache-row-contract.ts:51

算出「远端行必须自带」的列:本地表上 NOT NULL 且建表时拿不到默认值的那些。

Parameters​

ParameterTypeDescription
metadataEntityMetadata实体元数据

Returns​

ReadonlyMap<string, string>

属性名(或关系名)→ 物理列名;行里带其中任一个都算带齐

Remarks​

判据逐条对齐 create_table_sql.ts 的 create_table_column_sql —— 那里怎么建, 这里就怎么判,两处必须同改:

  • nullable 为真 → 建出来没有 NOT NULL,缺了无所谓;
  • uuid 主键 → DDL 给了 DEFAULT (lower(hex(randomblob(16))));
  • integer 主键 → PRIMARY KEY AUTOINCREMENT,省略即自增;
  • 字面量 default → 进 DDL 的 DEFAULT 子句(binary 除外,DDL 明确跳过它);
  • 函数 default → 一个字都不进 DDL。EntityBase.createdAt 的 default: () => new Date() 正是这一支:它是仓储层的东西,而 QueryCache 的落地 是绕开仓储的裸 SQL,于是列建成 NOT NULL、远端又不带,INSERT 必然被拒。

关系列走 relation.nullable / SET NULL 两道豁免;字面量 default 只对 MANY_TO_ONE 豁免 —— DDL 的 DEFAULT 子句只发给这一种,ONE_TO_ONE 的默认值一个字都不进建表语句。