- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
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数据库的文章就讲到这里了,如果你想了解更多关于用Python脚本迁移MongoDB数据到金仓-kingbase数据库的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我最近开始从事一个 Sails 项目。它目前在迁移表下具有以下格式的迁移。 20160826122004-create_users_table.js 'use strict'; module.expo
当我尝试迁移时 doctrine:migrations:migrate ,我收到此异常:“元数据存储不是最新的,请运行 sync-metadata-storage 命令来解决此问题。”。这仅在尝试在生
我在 ec2 linux 7 上有一个 MarkLogic 服务器。我想将它迁移到 linux 6。我将 ebs 移动到新的 linux 6 并将其安装在 /var/opt/MarkLogic . 我
我对 OpenID 很好奇。虽然我同意统一凭证的想法很棒,但我有一些保留意见。什么是防止 OpenID 提供商发疯并持有他们拥有的 OpenID 帐户直到您支付 n 美元?如果我决定不喜欢这个提供商,
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
我想通过在 Yii2 中的迁移添加一个新列,使用以下代码: public function up() { $this->addColumn('news', 'priority', $this-
我正在尝试在 SQLDelight 的表中添加更多列。我做了一个迁移文件 1.sqm .在迁移文件中,它给出了找不到表的错误。 我的 build.gradle.kts: sqldelight {
我有一个与 Flyway DB 迁移相关的问题。通常如何管理处理相同 DB 模式的多个项目(微服务)。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。他们是否有任何文档或最佳实践
我是 Laravel 的新手。我做了一份待办事项申请作为一项学校作业。我们必须使用迁移来创建我们的数据库。 我使用迁移创建了 2 个表。我的问题是:如果你第一次在你的电脑上运行这个项目,有没有办法自动
我正在尝试在 Laravel 中创建外键,但是当我使用 artisan 迁移表时,出现以下错误: [Illuminate\Database\QueryException] SQLSTATE[HY000
我从 Django 1.7 升级到 Django 1.9。我有多次迁移。升级后我无法再创建新的数据库。 问题是“django manage.py migrate”运行检查。检查导入应用程序 URL。这
我在创建数据迁移方面遇到了困难。我的应用程序使用两个数据库。我在 settings.py 中配置了数据库,并创建了一个像 Django docs 中一样的路由器. # settings.py DB_H
我有一个像这样的sql结构: CREATE TABLE resources ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, created_at
我正在尝试使用模式构建器向表添加枚举选项(不丢失当前数据集)。 我真正能够找到的关于列更改的唯一信息是 http://www.flipflops.org/2013/05/25/modify-an-ex
我尝试转移到一些 CMake 程序中,并且有一个从 xml 生成头文件的函数。 生成文件.am adaptor_glue.hpp: dbus_introspect.xml $(DBUSXX_X
我想将文件移至我的 iOS 应用程序的 CoreData 存储 ../Library/Application Support/MyApp/ 至 ../Documents/Stores/ 我可以使用 N
有没有人对数据迁移进出 NetSuite 有丰富的经验?我必须将 DB2 表导出到 MySQL,处理数据,然后导出到一个 CSV 文件中。然后获取帐户的 CSV 文件并再次操作数据以使帐户从我们的旧系
我正在尝试在 Django 上建立一个博客。我已经走到了创建模型的地步。他们在这里: from django.db import models import uuid class Users(mode
我最近使用 bluehost 上的 AutoSSL 工具将网站迁移到 HTTPS。我在内容中看到一些失真,例如缺少背景颜色、表格位移、缺少_logos 等。 有谁知道 HTTPS 迁移效果如何影响样式
我是一名优秀的程序员,十分优秀!