将mysql数据导出到csv时不要将NULL值转换为空字符串
Posted
技术标签:
【中文标题】将mysql数据导出到csv时不要将NULL值转换为空字符串【英文标题】:Don't convert NULL value to empty string when exporting mysql data to csv 【发布时间】:2020-03-29 02:30:44 【问题描述】:我正在使用 pymysql 游标将数据从 mysql 导出到 csv,如下所示:
cur = conn.cursor()
c = csv.writer(open(csvFilePath, "w",newline='',encoding='utf-8'))
for row in cur:
c.writerow(list(row))
但是每当我在 mysql 列中遇到空值时,光标都会在 csv 中写入一个空字符串“”。我想在 csv 中写入“NULL”字符串,以便在将其上传到另一个数据库(如 redshift)时将其转换为 null。
【问题讨论】:
空字符串是唯一真正有意义的东西。开始时该字段没有任何价值。另一方面,字符串“NULL”是一个实际值,包含 4 个字母。一,我可能会补充说,这可能会作为姓氏出现,多年来导致一些非常有趣的情况。 为什么你不应该发出"NULL"
而实际上没有数据:These unlucky people have names that break computers
我想区分实际在数据中的空字符串和 NULL 值(数据丢失)。如果有一种方法可以将数据从 mysql 写入 csv 并将 csv 上传到 redshift,同时在 redshift 中将空字符串保持为空字符串并将空值保持为 null,那就太好了。无论如何感谢您的建议。
您可以使用map
将None
转换为带有三元运算符的替换值,例如list(map(lambda x: x if x is not None else "NULL",row))
,如图here和here
你所说的意味着你有一个严重的问题——你没有空值。如果pymysql
返回一个空字符串,则表示该字段有一个空字符串。或者查询已经用空字符串替换了 NULL。您现在无法知道哪些值为 null。
【参考方案1】:
您可以管理来自 select 的正确输出,而不是在编写 csv 期间替换 null 值
所以尝试对空值使用适当的选择
select col1, col2, ifnull(your_possible_null_col, 'NULL'), ...
from your_table
where ...
您还可以查看 INTO OUTFILE 以避免逐行管理
【讨论】:
These unlucky people have names that break computers。像詹妮弗·努尔(Jennifer Null) @PanagiotisKanavos 您的评论对我没有意义.. 尝试更好地解释.. OP 可能更喜欢 N/A .. 或其他字符串,问题保持不变.. 每个数据库都有一个功能管理空值的映射.. 我希望如果我们可以使用 python 而不是编辑 sql 查询来实现它。可以使用raw
pymysql 游标并手动将它们映射到python 对象吗?我找不到raw
pymysql 游标及其映射以外的任何资源:mysql-docs
当您可以直接从查询中获取结果时,为什么要一一管理结果行.. ..您还应该看看 select INTO OUTFILE
我的表有很多列,其中有很多可以为空(不确定哪些可以为空)。这使得查询过于“手动”,并且很难将我的方法扩展到另一个表。 select INTO OUTFILE 是好的,直到表太大以至于 outfile 命令耗尽内存。以上是关于将mysql数据导出到csv时不要将NULL值转换为空字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 MySql 中,如何将 csv 文件中的 sql 字符串中的空值导出为双引号(“”)?