【问题标题】:Export MS SQL table with `null` values to CSV将具有“null”值的 MS SQL 表导出到 CSV
【发布时间】:2020-11-23 16:13:39
【问题描述】:

我试图弄清楚如何创建一个包含我在 MS SQL 数据库表中的 null 值的 csv 文件。现在我使用的脚本用''(空字符串)填充null值。我应该如何指示 csv Writer 保留空值?

源表示例

ID,Date,Entitled Key
10000002,NULL,805
10000003,2020-11-22 00:00:00,805

export_sql_to_csv.py

import csv
import os
import pyodbc

filePath = os.getcwd() + '/'
fileName = 'rigs_latest.csv'

server = 'ip-address'
database = 'db-name'
username = 'admin'
password = 'password'

# Database connection variable.
connect = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=' +
                                 server+';DATABASE='+database+';UID='+username+';PWD=' + password)
cursor = connect.cursor()

sqlSelect = "SELECT * FROM my_table"


cursor.execute(sqlSelect)
results = cursor.fetchall()

# Extract the table headers.
headers = [i[0] for i in cursor.description]

# Open CSV file for writing.
csvFile = csv.writer(open(filePath + fileName, 'w', newline=''),
                     delimiter=',', lineterminator='\r\n',
                     quoting=csv.QUOTE_NONE, escapechar='\\')

# Add the headers and data to the CSV file.
csvFile.writerow(headers)
csvFile.writerows(results)

运行上述脚本后的结果示例:

ID,Date,Entitled Key
10000002,,805
10000003,2020-11-22 00:00:00,805

我想保留null 值的主要原因是我想将该csv 文件转换为一系列插入SQL 语句,并针对Aurora Serverless PostgreSQL 数据库执行这些语句。数据库不接受 date 类型的空字符串并导致该错误:ERROR: invalid input syntax for type date: ""

【问题讨论】:

  • 您希望 CSV 文件包含什么内容?无论如何,因为它是一个 text 文件,它只能包含字符串值,用分隔符(这里是逗号)分隔。但是如果你知道哪些列需要调整以及你想要哪些值而不是空字符串,那么在 Python 脚本中替换相关的空值很容易......
  • 理想情况下,我想保留我的数据库中的NULL 值,这样当我使用该 csv 文件生成 SQL 语句时,NULL 值也会进入它们的空字符串。我想我只需要将我的 MS SQL 数据库中的 NULL DATE 类型列保存为 NULL 值而不是 ''

标签: python postgresql csv


【解决方案1】:

docs for the csv module 中所述,None 值按设计以''(空字符串)形式写入 CSV。所有其他非字符串值首先调用str

因此,如果您希望您的 CSV 包含字符串 null 而不是 '',那么您必须在值到达 CSV 写入器之前对其进行修改。也许:

results = [
['null' if val is None else val for val in row] for row in results
]

【讨论】:

  • 感谢您的建议,詹姆斯。这导致按预期将'null' 值添加到生成的CSV 文件中。我不得不稍微修改一下我的csv_to_sql python 脚本以适应这种变化,现在它会正确生成带有NULL 值的sql 语句:)
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 2010-10-14
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2021-02-18
相关资源
最近更新 更多