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

使用Python脚本从MongoDB迁移数据到Postgres无法匹配对应列咨询

MongoDB迁移Postgres字段匹配插入解决方案

你的现有代码将整条MongoDB文档序列化为JSON字符串后作为唯一插入值,因此只会写入表的第一列。要实现字段匹配写入对应列,需要将文档按键值拆分,匹配表的列名后用参数化查询插入,修正后的代码如下:

import json
import psycopg2
from pymongo import MongoClient
from decimal import Decimal
from bson.decimal128 import Decimal128
from bson.objectid import ObjectId
from datetime import datetime
import time

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        if isinstance(o, Decimal):
            return float(o)
        if isinstance(o, Decimal128):
            return float(str(o))
        if isinstance(o, datetime):
            return str(o)
        return json.JSONEncoder.default(self, o)

def convert_value(val):
    # 统一转换MongoDB特殊类型为Postgres可识别的格式
    if isinstance(val, ObjectId):
        return str(val)
    if isinstance(val, (Decimal, Decimal128)):
        return float(str(val))
    if isinstance(val, datetime):
        return str(val)
    return val

client = MongoClient("mongodb+srv://reporting:reporting123@miramira.ntara.mongodb.net")
db=client.Bookstore
col=db.Book
mdbcur=col.find()
with psycopg2.connect(host="localhost",
    database="Book",
    user="postgres", 
    password="root") as pgconn:
    pgcur=pgconn.cursor()
    for doc in mdbcur:
        # 转换所有字段值为Postgres兼容格式
        processed_doc = {k: convert_value(v) for k, v in doc.items()}
        # 动态获取列名和对应值
        columns = list(processed_doc.keys())
        values = list(processed_doc.values())
        # 生成参数化查询语句,占位符数量和字段数量匹配
        placeholders = ', '.join(['%s'] * len(columns))
        query_sql = f"INSERT INTO booktable ({', '.join(columns)}) VALUES ({placeholders})"
        pgcur.execute(query_sql, values)
        # 若需要逐行提交则打开下方注释
        # pgconn.commit()
        time.sleep(1)
    # 统一提交所有插入操作,效率更高
    pgconn.commit()
    pgcur.close()
    mdbcur.close()

注意事项

  • 请先确保Postgres中booktable的列名和MongoDB返回的文档字段名完全一致,如果存在名称差异,需要自行新增字段映射逻辑做名称转换
  • 采用参数化查询替代原有的字符串拼接SQL逻辑,避免了特殊字符导致的语法错误和SQL注入风险
  • 代码默认采用批量提交逻辑,如果你需要逐行持久化数据,可以将pgconn.commit()移回循环内部
  • 如果你需要所有字段都以字符串格式写入Postgres,可修改convert_value函数,所有返回值都用str()包裹即可

内容的提问来源于stack exchange,提问作者Saikrishna Rachuri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:57:00