用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
随机推荐
- 报表输入页码翻页(润乾 V2018)
报表数据分了太多页,一页一页翻页查看数据嫌麻烦,可以试试这种翻页效果--输入页码翻页. 润乾报表提供了翻页相关的 JS 函数,可以在报表展现的页面中添加 JS 调用翻页函数实现输入页码跳转到对应页. ...
- ef 查询生成语句的几种方式
前言 整理一下ef 如何查看生成sql 语句的,现在有ef core 了,统一整理一下. 正文 方式如下: 数据库监听 这是一种推荐方式,因为调试和代码分开,不会有影响. 然后连接: 然后可以进行一些 ...
- ES6---new Promise()使用方法
2015年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范.作为ES6中最重要的特性之一,我们有必要掌握并理解透彻.本文将由浅到深,讲解Promise ...
- ERP财务管理有哪些功能?如何选择合适的ERP软件开发商定制开发适合自己的ERP财务管理?
企业日常运营中,分工明确.结构清晰的财务管理非常重要,因此在完整的ERP解决方案中,财务管理是不可或缺的部分,甚至财务管理是整个ERP解决方案的核心,其它功能模块都围绕着财务管理构建价值链创造流程,最 ...
- mockjs 模拟实现增删改查
/*mUtils.js用于解析get请求的参数*/ export const param2Obj = url => { const search = url.split('?')[1] if ( ...
- 力扣217(java&python)-存在重复元素(简单)
题目: 给你一个整数数组 nums .如果任一值在数组中出现 至少两次 ,返回 true :如果数组中每个元素互不相同,返回 false . 示例 1: 输入:nums = [1,2,3,1]输出:t ...
- 如果千百年前有视觉AI算法,世界将会是什么样的光景呢?
视觉AI算法在近些年取得了一定的突破,被应用在了越来越多的地方,我相信距离真正的AI普及这个大目标也越来越近了.我时常在想假如古代也有视觉AI算法,那是不是很多故事的结局都将被改写?<伯乐相马& ...
- 慢SQL治理分享
简介: 这里的慢SQL指的是MySQL慢查询,是运行时间超过long_query_time值的SQL.真实的慢SQL通常会伴随着大量的行扫描.临时文件排序或者频繁的磁盘flush,直接影响就是磁盘IO ...
- WPF 下拉框选项做鼠标 Hover 预览效果
本文来告诉大家如何在 WPF 中,在 下拉框 ComboBox 里面,鼠标移动到 ComboBoxItem 上时,自动触发对应的事件,用来预览此选项值.例如我在实现一个颜色下拉框,此时我可以通过点击下 ...
- MSBuild 输出日志可视化工具 MSBuild Structured Log Viewer 简介
感谢 Vatsan Madhavan 小伙伴推荐的 MSBuild 输出日志可视化工具,这个工具可以使用漂亮的 WPF 界面预览 MSBuild 复杂的输出内容 这是一个完全开源的工具,请看 Kiri ...