用Python脚本迁移MongoDB数据到金仓-kingbase数据库
1、首先需要明确MongoDB与kingbase的对应关系,collection相当于table,filed相当于字段,根据这个对应关系创建表;
此次迁移的MongoDB里的数据字段是:_id(自动生成的objectid),image(转成二进制存储的文档)
所以在金仓里创建表 create table admin(id varchar,image bytea);
2、安装Python环境,由于是内网环境,没有yum源,需要从能连接互联网的环境下载好相应的安装包
Python:3.9.0版本
用到以下这些包
import pymongo
import ksycopg2
import concurrent.futures
from ksycopg2 import pool
import logging
from urllib.parse import quote_plus
------------------------------------------------------------------------------------
pip download pymongo -d pymongo_packages --下载pymongo库
pip3 install --no-index --find-links=. pymongo --安装pymongo库
金仓的Python驱动可以到金仓官网下载,需要找和Python对应的版本
以下是Python脚本内容:
import pymongo
import psycopg2
import concurrent.futures
from psycopg2 import pool
import logging
from urllib.parse import quote_plus
import os # 初始化日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') # MongoDB设置
username='admin'
password='SCJGscjg@123'
host='10.253.228.41'
port='27017'
encoded_username = quote_plus(username)
encoded_password = quote_plus(password)
uri = f"mongodb://{encoded_username}:{encoded_password}@{host}:{port}/"
mongo_client = pymongo.MongoClient(uri)
mongo_db = mongo_client['admin']
mongo_collection = mongo_db['admin'] # 连接池设置
kb_pool = psycopg2.pool.ThreadedConnectionPool(
minconn=1,
maxconn=20,
host="10.253.228.110",
database="mongo",
user="system",
password="1",
port="54322"
) # 偏移量存储文件
OFFSET_FILE = 'offset.txt' def read_offset():
if os.path.exists(OFFSET_FILE):
with open(OFFSET_FILE, 'r') as f:
return int(f.read().strip())
return 0 def write_offset(offset):
with open(OFFSET_FILE, 'w') as f:
f.write(str(offset)) def batch_insert(mongo_data):
kb_conn = None
try:
kb_conn = kb_pool.getconn()
with kb_conn.cursor() as kb_cursor:
for data in mongo_data:
id_value = data['_id']
image_data = data['image']
insert_query = "INSERT INTO dzzzwj(id, image) VALUES (%s, %s)"
kb_cursor.execute(insert_query, (id_value, image_data))
kb_conn.commit()
return True
except Exception as e:
logging.error(f"批量插入错误: {e}")
return False
finally:
if kb_conn:
kb_pool.putconn(kb_conn) def main():
batch_size = 80
offset = read_offset()
executor = concurrent.futures.ThreadPoolExecutor(max_workers=8) try:
while True:
mongo_data = list(mongo_collection.find().skip(offset).limit(batch_size))
if not mongo_data:
break future = executor.submit(batch_insert, mongo_data)
future.add_done_callback(lambda f, offset=offset: (
logging.info(f"Batch completed with offset {offset}") if f.result() else logging.error(f"Batch failed with offset {offset}"),
write_offset(offset + batch_size) if f.result() else None
))
offset += batch_size if future.result() else 0
except Exception as e:
logging.error(f"主循环错误: {e}")
finally:
executor.shutdown(wait=True)
mongo_client.close()
kb_pool.closeall()
logging.info("资源已清理完毕。") if __name__ == "__main__":
main()
这段代码思路:
(1)连接MongoDB和kingbase数据;
(2)因为MongoDB数据量比较大,并且需要断点续传,索引用了分页和排序;
(3)数据成功插入金仓数据库后,增加偏移量,并且将当前偏移量记录在offset.txt里面,以便脚本停了,可以再重启接着迁数据;
因为二进制数据从MongoDB和金仓数据查询出来的内容看着不一样,所以下面的代码是计算两边数据md5值对比的简单代码
import pymongo
import ksycopg2
import base64
import hashlib def compute_hash(data):
return hashlib.md5(data).hexdigest() mongo_client = pymongo.MongoClient('mongodb://127.0.0.1:27017/')
mongo_db = mongo_client['admin']
mongo_collection = mongo_db['mongodb'] database = "test"
user = "system"
password = "1"
host = "127.0.0.1"
port = "54322" conn = ksycopg2.connect(database=database, user=user, password=password, host=host, port=port) cursor = conn.cursor() mongo_data = mongo_collection.find()
print(mongo_data) # 插入到 kingbase
for data in mongo_data:
id_value = data['_id']
image_data = data['image'] #image_data = base64.b64encode(base64_data).decode('utf-8') image_data_byte = image_data
if isinstance(image_data, bytes):
mongo_hash = compute_hash(image_data_byte)
print(mongo_hash) #image_data = base64.b64encode(base64_data).decode('utf-8')
if id_value and image_data:
insert_query = "INSERT INTO zzwj(_id, image) VALUES (%s, %s)"
cursor.execute(insert_query, (id_value, image_data)) # 提交事务
conn.commit() cursor.execute("select _id, image from zzwj")
rows = cursor.fetchall() for row in rows:
_id = row[0]
image_byte = row[1] pg_hash = compute_hash(image_byte)
print(pg_hash) # 关闭连接
cursor.close()
conn.close()
mongo_client.close()
用Python脚本迁移MongoDB数据到金仓-kingbase数据库的更多相关文章
- 金仓Kingbase数据库网页数据维护分析工具
金仓Kingbase是优秀的国产数据库产品,在能源,政务,国防等领域广泛使用, 现在TreeSoft数据库管理系统已支持Kingbase了,直接在浏览器中就可以操作查看Kingbase数据了,十分方便 ...
- Delphi中使用python脚本读取Excel数据
Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...
- python脚本批量生成数据
在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家 ...
- 除了binlog2sql工具外,使用python脚本闪回数据(数据库误操作)
利用binlog日志恢复数据库误操作数据 在人工手动进行一些数据库写操作的时候(比方说数据修改),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线 ...
- 使用python脚本批量造数据
本篇将采用 Python 脚本的方式进行批量给mysql造数据. 为了使 Python 可以连上数据库(MySQL),并且可以与数据库交互(增删改查等操作),则需要安装 MySQL 客户端操作库. ...
- Rocky4.2下安装金仓v7数据库(KingbaseES)
1.准备操作系统 1.1 系统登录界面 1.2 操作系统版本信息 jdbh:~ # uname -ra Linux jdbh -x86_64 # SMP Fri Dec :: CST x86_64 G ...
- 润乾配置连接kingbase(金仓)数据库
问题背景 客户根据项目的不同,使用润乾连接的数据库类型各种各样,此文针对前几日使用润乾设计器连接kingbase金仓数据库做一个说明. kingbase金仓数据库是一款国产数据库,操作方式和配置 ...
- 如何用Python脚本从文件读取数据?
最近自学Python的进度比较慢,工作之余断断续续的看着效率比较低,看来还是要狠下心来每天进步一点点. 还记得前段时间陈大猫提了一口"先实现用python读取本地文件",碰巧今天看 ...
- python中读取mongodb数据并保存为csv格式的文件
import pandas as pd import matplotlib.pyplot as plt import pymongo %matplotlib inline # 连接mongodb数据库 ...
- 使用Python脚本操作MongoDB的教程
Reference: http://www.jb51.net/article/64225.htm
随机推荐
- 重新点亮shell————awk函数[十五]
前言 简单介绍一下awk函数. 正文 算术函数 字符串函数 自定义函数 例子: 结 awk就到这里了.
- 重新点亮linux 命令树————服务管理工具[二十五]
前言 简单整理一下服务管理工具. 正文 服务集中管理工具. service 功能简单 systemctl 功能多 先来看下service脚本位置: 然后看下vim network 这里可以看到代码非常 ...
- 给蚂蚁金服 antv 提个 PR, 以为是改个错别字, 未曾想背后的原因竟如此复杂!
前言 什么? 你不了解G2Plot? 没关系, 今天咱们要分享的内容和G2Plot的关系, 就像雷锋和雷峰塔的关系. 因此, 不必担心听不懂. 我一直觉得, 如果我写的文章有人看不懂, 那一定是我写的 ...
- b站的视频进度条悬浮预览视频画面实现方式
1.探究 在看b站视频,滑到进度条的时候突发奇想,想知道这个预览图是怎么做到的 打开控制台,发现每次移动鼠标悬浮位置的时候都会发出一条网络请求,并且该请求的size显示来源于内存,当时以为每次加载视频 ...
- 【Oracle】预定义说明的部分 ORACLE 异常错误(EXCEPTION)
预定义说明的部分 ORACLE 异常错误(EXCEPTION) 参考链接:https://www.cnblogs.com/thescentedpath/p/errordeal.html EXCEPTI ...
- 云原生微服务的下一站,微服务引擎 MSE 重磅升级
简介:管好微服务,成为云原生时代的新难题. 管好微服务,成为云原生时代的新难题. 从建好微服务到管好微服务,差的虽是一个字,连接起两边的却需要大量的微服务落地经验.因为软件架构的核心挑战是解决业务快 ...
- [Trading] 人物: 陈向忠日内交易技术核心 - 趋势形态与成交量
分时图判断趋势(开仓方向) 只要是低点不断抬高的,就是上涨趋势,高点是否提高是其次的. 只要是高点不断降低的那就是下降趋势,假如低点也在不断降低,那么这样的下降趋势就更加完美一些. 很多人就是看对了趋 ...
- [Trading] 如何应对股价下跌, 投资技巧
如果你想利用股价下跌的机会,你可以做以下事情来潜在地赚取利润. 为什么股价下跌会吓到投资者 商品在低价时,我们都倾向于买入,对于股票,价格暴跌以投资的形式损失你的钱,令人产生卖出情绪. 然而在卖掉之前 ...
- webapp监听手机物理返回键,返回上一页面或者关闭app
网上抄的做笔记: 1.项目下建文件夹commonFunction->physicBackListener.js 2.这个js文件内复制代码: document.addEventListener( ...
- 云原生最佳实践系列 6:MSE 云原生网关使用 JWT 进行认证鉴权
01 方案概述 MSE 网关可以为后端服务提供转发路由能力,在此基础上,一些敏感的后端服务需要特定认证授权的用户才能够访问.MSE 云原生网关致力于提供给云上用户体系化的安全解决方案,其中 JWT 认 ...