数据迁移到 Django 模型表:详尽指南

2024-06-22 18:20

本文主要是介绍数据迁移到 Django 模型表:详尽指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据迁移是许多应用程序开发过程中必不可少的一部分。在这篇文章中,我们将详细分析和总结如何通过一个定制的 Django 管理命令,将数据从 MySQL 数据库迁移到 Django 模型表中。这种方法可以确保数据在多个数据库之间有效且安全地迁移,同时避免了手动操作的繁琐和错误。

项目概览

我们将实现一个 Django 管理命令,该命令将从 MySQL 数据库中提取数据并批量插入到 Django 模型表中。这个过程将使用事务处理来确保数据一致性,并通过记录偏移量来支持断点续传。

代码详解

首先,我们需要定义一个 Django 管理命令。以下是完整的代码:

import os
import traceback
import mysql.connector
from django.db import transaction
from mysql.connector import Error
from django.core.management.base import BaseCommand
from myapp.models import HotSearchTermsReportABAdb_config = {# MySQL 数据库配置
}class Command(BaseCommand):help = '数据迁移到 Django 模型表'def handle(self, *args, **kwargs):try:db_conn = mysql.connector.connect(**db_config)db_cursor = db_conn.cursor()self.stdout.write(self.style.SUCCESS("正在连接数据库"))except Error as e:self.stdout.write(self.style.ERROR(f"连接过程中出现异常:{e}"))self.stdout.write(self.style.ERROR(str(traceback.format_exc())))returnperiod = '最新'fetch_sql = f"""SELECT search_rank, search_term FROM hot_terms_table WHERE period = '{period}' LIMIT %s OFFSET %s;"""# 批量大小batch_size = 5000# 读取偏移量offset = self.get_last_offset()total_rows_transferred = 0try:while True:db_cursor.execute(fetch_sql, (batch_size, offset))batch_data = db_cursor.fetchall()if not batch_data:break  # 如果没有更多的数据,退出循环# 将batch_data转换为HotSearchTermsReportABA对象列表objects = [HotSearchTermsReportABA(search_rank=row[0],search_term=row[1]) for row in batch_data]with transaction.atomic():  # 开启事务# 在Django中批量创建对象HotSearchTermsReportABA.objects.bulk_create(objects)# 更新偏移量和总条数offset += batch_sizetotal_rows_transferred += len(batch_data)self.stdout.write(self.style.SUCCESS(f"{len(batch_data)} 行数据已在此批中转移。"))self.stdout.write(self.style.SUCCESS(f"总共完成将 {total_rows_transferred} 行数据转移。"))# 更新文件中的偏移量self.update_last_offset(offset)except Error as e:self.stdout.write(self.style.ERROR(f"传输过程中出现异常:{e}"))self.stdout.write(self.style.ERROR(str(traceback.format_exc())))finally:# 关闭所有连接和游标if db_cursor:db_cursor.close()if db_conn:db_conn.close()def get_last_offset(self):# 从文件中读取偏移量offset_file = 'migration_offset.txt'if os.path.exists(offset_file):with open(offset_file, 'r') as file:return int(file.read().strip())return 0def update_last_offset(self, offset):# 将偏移量写入文件offset_file = 'migration_offset.txt'with open(offset_file, 'w') as file:file.write(str(offset))# python manage.py migrate_data

代码分析

数据库连接

首先,代码尝试连接到 MySQL 数据库。如果连接失败,会捕获异常并输出错误信息。

try:db_conn = mysql.connector.connect(**db_config)db_cursor = db_conn.cursor()self.stdout.write(self.style.SUCCESS("正在连接数据库"))
except Error as e:self.stdout.write(self.style.ERROR(f"连接过程中出现异常:{e}"))self.stdout.write(self.style.ERROR(str(traceback.format_exc())))return
SQL 查询与数据提取

接下来,代码定义了一个 SQL 查询语句,用于从 hot_search_terms_report 表中获取数据。使用 LIMITOFFSET 实现分页读取数据。

period = '最新'
fetch_sql = f"""SELECT search_rank, search_term FROM hot_terms_table WHERE period = '{period}' LIMIT %s OFFSET %s;
"""
batch_size = 5000
offset = self.get_last_offset()
total_rows_transferred = 0
数据迁移与事务处理

代码使用一个循环来分页读取数据,并将数据转换为 Django 模型对象,然后使用事务处理将数据批量插入到 Django 数据库中。事务处理确保数据的一致性,即使在插入过程中发生错误,也能回滚事务。

try:while True:db_cursor.execute(fetch_sql, (batch_size, offset))batch_data = db_cursor.fetchall()if not batch_data:break  # 如果没有更多的数据,退出循环objects = [HotSearchTermsReportABA(search_rank=row[0],search_term=row[1]) for row in batch_data]with transaction.atomic():HotSearchTermsReportABA.objects.bulk_create(objects)offset += batch_sizetotal_rows_transferred += len(batch_data)self.stdout.write(self.style.SUCCESS(f"{len(batch_data)} 行数据已在此批中转移。"))self.stdout.write(self.style.SUCCESS(f"总共完成了将 {total_rows_transferred} 行数据转移。"))self.update_last_offset(offset)
偏移量管理

为了支持断点续传,代码会将每次读取的数据偏移量存储在一个文件中。下次运行时,会从该文件读取偏移量,继续上次未完成的迁移任务。

def get_last_offset(self):offset_file = 'migration_offset.txt'if os.path.exists(offset_file):with open(offset_file, 'r') as file:return int(file.read().strip())return 0def update_last_offset(self, offset):offset_file = 'migration_offset.txt'with open(offset_file, 'w') as file:file.write(str(offset))

使用方法

  1. 配置数据库连接: 在 db_config 中填写你的 MySQL 数据库连接配置。

  2. 创建 Django 管理命令: 将上述代码保存为 management/commands/migrate_data.py 文件。

  3. 运行命令: 使用以下命令运行数据迁移:

python manage.py migrate_data

总结

通过这种方法,我们可以实现从 MySQL 数据库到 Django 模型表的高效、安全的数据迁移。事务处理和偏移量管理的引入,不仅确保了数据的一致性和完整性,还为大规模数据迁移提供了良好的支持。这种方法同样适用于其他类似的数据迁移任务,具有很高的通用性和实用性。

作者:pycode
链接:https://juejin.cn/post/7382931501607059490

这篇关于数据迁移到 Django 模型表:详尽指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085055

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

macOS彻底卸载Python的超完整指南(推荐!)

《macOS彻底卸载Python的超完整指南(推荐!)》随着python解释器的不断更新升级和项目开发需要,有时候会需要升级或者降级系统中的python的版本,系统中留存的Pytho版本如果没有卸载干... 目录MACOS 彻底卸载 python 的完整指南重要警告卸载前检查卸载方法(按安装方式)1. 卸载

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二