You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:57:46