gpt4 book ai didi

mysql - 从 MySQL 迁移到 mongo 的空值

转载 作者:行者123 更新时间:2023-11-30 23:13:11 24 4
gpt4 key购买 nike

我需要将一些表从 MySQL 迁移到 mongoDB。在网上搜索后,对我来说,将 MySQL 导出到 CSV 并从该 CSV 导入到 mongoDB 应该是最快和最简单的方法。

我正在使用该查询导出 MySQL:

select *  into outfile '/tmp/feed.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ''
from feeds;

但是有一个问题。

如果 MySQL 字段为 NULL,则 MySQL 导出将 \N(或 \\N)写入 CSV 文件。通过导入该文件,mongoDB 将 \\N 作为字符串而不是 NULL 值导入。

mongoDB 导入选项 --ignoreBlanks 将不起作用,因为 \\N 在 mongoDB 的观点中不是“空白”。

所以我的问题是:

1.) 如何避免将 NULL 导出为 \\N

2.) mongodbimport 如何将 \\N 读取/解释为 NULL 或空值?

顺便说一句:不能选择对 CSV 进行后处理以搜索和替换 \\N

关于 1.) 的可能答案可能是对 select 语句的修改:SELECT IFNULL( field1, "") 但在这种情况下,我必须定义并检查每一列。如果所有列都在 select 语句中定义,则导出脚本不会那么灵活。

//编辑:在玩那个 import<->export 时我发现了另一个问题:日期字段,它也被解释为来自 mongoimport 的字符串

最佳答案

我会发表评论而不是添加答案,但我的声誉仍然很低......

我在我正在从事的项目中所做的是使用 Python 脚本进行迁移。我在 CSV 中有导出的表格。我使用的代码如下所示:

import csv
import zip
import pymongo

f = open( filename )
reader = csv.reader( f )

destinationItems = []

以下读取列名称(CSV 中的第一行)

columns = next( reader )

列可以放在一个元组中,在这里我称之为“键”。此处的代码忽略了列名。然后将每一行转换为字典,准备好进行修改以删除(或使用 - 执行其他操作)NULL。

keys = tuple( columns )

for property in reader:
entry = dict( zip( keys, property ) )

和以下处理 NULL;在这种情况下,如果在导出的 CSV 中发现该条目为“NULL”,我将完全删除该条目。

    entry = { k:v for k,v in entry.iteritems() if ( k in keys and ( v != 'NULL' ) or k not in keys ) }

destinationItems.append( entry )

更新mongodb实例

mongoClient = pymongo.MongoClient()
mongoClient['mydb'].mycollection.insert( destinationItems )

关于mysql - 从 MySQL 迁移到 mongo 的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19045200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com