PostgreSQL使用psycopg2跨Schema复制数据时出现类型不匹配报错求助
解决psycopg2跨Schema复制数据时的"record类型不匹配"错误
嘿,这个问题我一眼就看出症结所在了!你遇到的错误根源是SELECT语句里给列加了括号——PostgreSQL会把("name","description","manufacturer")当成单一的record类型值,而不是三个独立的列。这就导致插入时,这个record被试图塞进目标表的id列(因为你没指定插入的列,PostgreSQL会按顺序匹配),自然就出现类型不匹配的报错了。
修正后的代码方案
你只需要去掉SELECT里的括号,同时最好明确指定目标表要插入的列(毕竟目标表有自增的id列,不需要手动插入值),修改后的代码如下:
columns = ('name', 'description', 'manufacturer') source_schema = "public" target_schema = "target" table = "supplies" # 修改后的查询:明确指定插入列,去掉SELECT里的括号 query = sql.SQL('INSERT INTO {target_schema}.{table} ({columns}) SELECT {columns} FROM {source_schema}.{table}').format( source_schema=sql.Identifier(source_schema), target_schema=sql.Identifier(target_schema), table=sql.Identifier(table), columns=sql.SQL(',').join(map(sql.Identifier, columns)), )
为什么要这么改?
- 去掉SELECT里的括号后,PostgreSQL会正确识别这三个是独立的列,而非一个record对象。
- 明确指定
INSERT INTO ... ({columns})能让数据库精准匹配列,避免源表和目标表列顺序不一致导致的问题,同时也告诉数据库id列用自增值填充,不需要我们提供数据。
额外提示
如果后续源表或目标表的结构有调整,这种明确指定列的写法会更健壮,能避免很多潜在的意外问题。
内容的提问来源于stack exchange,提问作者Viktor Andriichuk
相关产品推荐
相关产品推荐

