使用pgloader带--with 'quote identifiers'迁移时出现列不存在错误
MySQL到PostgreSQL迁移:保留驼峰命名同时解决列不存在错误
问题原因
PostgreSQL对带双引号的标识符大小写敏感,而MySQL默认不区分。用--with "quote identifiers"时,pgloader会把MySQL的驼峰列名(如invoiceNo)转成PostgreSQL的"invoiceNo",但如果迁移过程中关联的PL/pgSQL代码引用列时没加双引号,或者pgloader自动映射出现重复双引号(比如生成""invoiceNo""),就会触发column ""invoiceNo"" does not exist错误。
可行解决方案
1. 自定义pgloader加载脚本,精准控制标识符映射
写一个自定义加载脚本,显式指定表和列的带引号命名,避免自动映射的问题:
-- 保存为 load-mysql-to-pgsql.load LOAD DATABASE FROM mysql://[用户名]:[密码]@[MySQL地址]/[数据库名] INTO postgresql://[用户名]:[密码]@[PG地址]/[数据库名] WITH quote identifiers, create tables, create indexes, reset sequences -- 显式映射表和列的命名 ALTER TABLE NAMES MATCHING 'Order' TO '"Order"' ALTER COLUMN NAMES MATCHING 'invoiceNo' TO '"invoiceNo"' ;
执行命令:pgloader load-mysql-to-pgsql.load
这种方式能确保驼峰命名被正确带引号创建,同时避免重复双引号的问题。
2. 修复关联的PL/pgSQL代码
错误提示中的PL/pgSQL代码大概率是引用列时没加双引号,导致PostgreSQL自动把invoiceNo转成小写invoiceno,但实际列是带引号的"invoiceNo",自然找不到。
把代码里的列引用改成带双引号的形式:
-- 修正前 SELECT invoiceNo FROM "Order"; -- 修正后 SELECT "invoiceNo" FROM "Order";
3. 临时调整PostgreSQL的大小写配置(仅限新库)
如果是全新的PostgreSQL数据库,可以修改postgresql.conf:
lower_case_table_names = 1
重启数据库后,PostgreSQL会自动把未加引号的标识符转为小写,但同时也能识别带引号的驼峰标识符。注意:这个配置只能在数据库初始化前或清空数据后设置,否则会引发对象冲突,不推荐长期使用。
内容的提问来源于stack exchange,提问作者antonwilhelm
相关产品推荐
相关产品推荐

