如何配置pgloader禁止tinyint(1)自动转boolean保留为smallint
pgloader覆盖tinyint(1)默认转boolean的正确配置
pgloader的类型转换规则遵循先匹配先生效的逻辑,内置的tinyint精度为1时转boolean的规则优先级高于无匹配条件的通用类型规则,这也是多数人自定义规则覆盖失败的核心原因。
可直接复用的正确配置
将针对精度为1的tinyint的转换规则放在CAST块的最顶部,优先于所有其他规则(包括内置规则)完成匹配,即可实现全量tinyint保留为smallint的需求:
LOAD DATABASE FROM mysql://你的MySQL账号:密码@MySQL地址:3306/源库名 INTO postgresql://PG账号:密码@PG地址:5432/目标库名 WITH include drop, create tables, create indexes, reset sequences, foreign keys CAST -- 这条规则必须放在CAST块第一行,优先拦截tinyint(1)的匹配 type tinyint when (= 1 precision) to smallint, -- 其余精度的tinyint统一转smallint type tinyint to smallint, -- 其他自定义转换规则按顺序往下写即可 type int with extra auto_increment to serial drop default drop not null using zero-dates-to-null ALTER SCHEMA '源库名' RENAME TO 'public';
常见失败原因排查
- 规则顺序错误:如果把tinyint转smallint的规则写在CAST块靠后的位置,内置的tinyint(1)转boolean规则会先完成匹配,自定义规则不会生效
- 漏写精度匹配条件:仅写
type tinyint to smallint属于无判断条件的通用规则,优先级低于带when (= 1 precision)判断条件的内置规则,无法覆盖默认行为 - 多余的转换函数:tinyint到smallint属于兼容数值类型,不需要额外指定using转换函数,错加转换函数会触发无明确提示的模糊类型报错
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

