fix: drop the conflict target so partitioned tables can accept writes
PG requires a partitioned table's unique constraints to include the partition key, so issue #12's RANGE partitioning on created_at forces the primary key to (call_id, created_at). The old `ON CONFLICT (call_id) DO NOTHING` then matches no constraint and PG rejects every row with there is no unique or exclusion constraint matching the ON CONFLICT specification which the recorder swallows as a per-row warning: telemetry would go silently dark under a partitioned deployment. The target-free form is valid on both table shapes and is literally equivalent on a plain table (the primary key is its only unique constraint). SQLite's `INSERT OR IGNORE` already carries no target and is untouched. Integration coverage on the real PG instance, both inside self-created temp schemas: a plain table still keeps one row per call_id, and a table partitioned by created_at now accepts writes and reads them back. The second case was red before this change with the error above.
This commit is contained in:
@@ -131,7 +131,9 @@ _FROZEN_PG_INSERT = (
|
||||
"sampling, reasoning_tokens, tenant_id, meta) "
|
||||
"VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, "
|
||||
"$19, $20, $21, $22, $23, $24) "
|
||||
"ON CONFLICT (call_id) DO NOTHING"
|
||||
# 无冲突目标(issue #13 Task 2): 带 `(call_id)` 的版本在按 created_at 分区、
|
||||
# 主键为 (call_id, created_at) 的表上匹配不到约束,PG 直接拒收整条写入
|
||||
"ON CONFLICT DO NOTHING"
|
||||
)
|
||||
|
||||
|
||||
@@ -174,16 +176,17 @@ class TestSchemaModule:
|
||||
assert all("IF NOT EXISTS" not in stmt for _, stmt in PG_BACKFILL)
|
||||
|
||||
def test_insert_sql_reproduces_the_frozen_statements(self):
|
||||
"""`insert_sql(backend, COLUMNS)` 必须与搬迁前的 `_INSERT` 逐字节相同。"""
|
||||
"""`insert_sql(backend, COLUMNS)` 与搬迁前的 `_INSERT` 一致(PG 侧去掉冲突目标)。"""
|
||||
from polygateway.telemetry.schema import COLUMNS, insert_sql
|
||||
|
||||
assert insert_sql("sqlite", COLUMNS) == _FROZEN_SQLITE_INSERT
|
||||
assert insert_sql("postgres", COLUMNS) == _FROZEN_PG_INSERT
|
||||
# 裁剪列表按位置占位符重新编号,不留空洞
|
||||
assert insert_sql("postgres", ["call_id", "model"]) == (
|
||||
"INSERT INTO llm_calls (call_id, model) VALUES ($1, $2) "
|
||||
"ON CONFLICT (call_id) DO NOTHING"
|
||||
"INSERT INTO llm_calls (call_id, model) VALUES ($1, $2) ON CONFLICT DO NOTHING"
|
||||
)
|
||||
# 冲突目标不得被"顺手"补回: 分区表上它会让每一条遥测都被 PG 拒收
|
||||
assert "ON CONFLICT (" not in insert_sql("postgres", COLUMNS)
|
||||
|
||||
def test_insert_sql_rejects_foreign_columns_and_backends(self):
|
||||
"""列名来自数据库探测结果而非常量,子集校验是唯一的注入面闸门。"""
|
||||
|
||||
Reference in New Issue
Block a user