fix(数据库): 索引方向被 .op() 吞掉,schema.ts 和真实库对不上
根因不是 .desc(),是 opclass。drizzle-kit 的 CreatePgIndexConvertor 里那个 三元一旦走进 opclass 分支就回不到方向分支,而 pull 给每一列都挂了 .op(...), 于是"写了 .desc() 却生成不出 DESC"每次都会重演。实测确认:不写 .op() 时 多列混合方向能正常生成,所以原先"多列混合方向的索引别指望 generate"这条 自我限制不成立。 announcement_list_idx 和 contest_create_time_idx 两条真实索引踩在这上面: 生产库里它们带 DESC(schema.sql:1636、:1685),schema.ts 却会生成成全 ASC。 contest_create_time_idx 的 opclass 还串了位(contest_id 标 timestamptz_ops、 create_time 标 int4_ops),那条 SQL 真拿去执行 Postgres 会直接拒绝。 改快照而不是生成迁移:generate 想 drop + recreate,但重建出来的和生产库里 那两条完全等价(DESC 默认就是 NULLS FIRST),执行它只是在 12.3 万行的表上 白挨一次锁。手法和当初处理 problem_tag_name_ci_unique 的 opclass 一致。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -489,22 +489,19 @@
|
||||
"expression": "visible",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last",
|
||||
"opclass": "bool_ops"
|
||||
"nulls": "last"
|
||||
},
|
||||
{
|
||||
"expression": "top",
|
||||
"isExpression": false,
|
||||
"asc": false,
|
||||
"nulls": "first",
|
||||
"opclass": "bool_ops"
|
||||
"nulls": "first"
|
||||
},
|
||||
{
|
||||
"expression": "create_time",
|
||||
"isExpression": false,
|
||||
"asc": false,
|
||||
"nulls": "first",
|
||||
"opclass": "bool_ops"
|
||||
"nulls": "first"
|
||||
}
|
||||
],
|
||||
"isUnique": false,
|
||||
@@ -2915,15 +2912,13 @@
|
||||
"expression": "contest_id",
|
||||
"isExpression": false,
|
||||
"asc": true,
|
||||
"nulls": "last",
|
||||
"opclass": "timestamptz_ops"
|
||||
"nulls": "last"
|
||||
},
|
||||
{
|
||||
"expression": "create_time",
|
||||
"isExpression": false,
|
||||
"asc": false,
|
||||
"nulls": "first",
|
||||
"opclass": "int4_ops"
|
||||
"nulls": "first"
|
||||
}
|
||||
],
|
||||
"isUnique": false,
|
||||
|
||||
Reference in New Issue
Block a user