我有一个.txt文件,其中的字段由管道终止。该文件位于S3存储桶中,我编写了一个脚本将文件中的数据加载到MySQL数据库中。我的一切工作都正常,但我遇到了一个问题,我卡住了。该问题是在格式化日期值。
奇怪的是我有两列都是相同的日期格式,这是:日-月-年(01-Jan-96),并且最初它们都作为0000-00- 00加载到数据库中。我成功地设置了其中一列的格式,但似乎无法正确设置第二列的格式。在CREATE TABLE语句中,它们都是DATE值,且DEFAULT为NULL。因此,这两个列都是以相同的方式创建的,并且在my .txt文件中这两个列的格式也相同。
当在LOAD DATA LOCAL INFILE语句中列出列名时,我对这两个列都使用了变量,并且日期的格式在SET语句中完成。
这是我所尝试的,以及很多的变化。
import mysql.connector
conn = mysql.connector.connect(
user='username', password='pw', host='hostname', database='db', allow_local_infile=True
)
cursor = conn.cursor()
sql = """LOAD DATA LOCAL INFILE '/myfile.txt'
INTO TABLE tablename
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(column1, column2, @s_date_value, column4, @o_date_value, column5)
SET
S_DATE = date_format(str_to_date(@s_date_value, '%d-%b-%y'), '%d-%b-%y'),
O_DATE = date_format(str_to_date(@o_date_value, '%d-%b-%y'), '%d-%b-%y');"""
cursor.execute(sql)
conn.commit()
conn.close()
因此,S_DATE正确加载,这样写的O_DATE将加载为0000-00-00。如果我写以O_DATE开头的行,而不写date_format,我就能以YYYY-MM-DD格式加载实际日期,如下所示:
O_DATE = str_to_date(@o_date_value, '%d-%b-%y');"""
如果我只使用date_format编写它,我会得到所有NULL值,如下所示:
O_DATE = date_format(@o_date_value, '%d-%b-%y');"""
有一点我不明白,为什么我还需要str_to_date,因为它们首先是作为DATE值创建的。但是,date_format和str_to_date的组合对S_DATE有效。
我也考虑过这个问题与在SET语句中列出多个查询有关,但我似乎通过研究发现这是可以接受的,我尝试在SET语句中只包含O_DATE而不包含S_DATE,我得到了相同的结果。
我也尝试过在UPDATE语句中将它们组合起来,并使用cursor.execute()执行它。我尝试过的另一个解决方案是使用regex编写SET语句,但也不成功。
这是我的第一篇关于堆栈溢出的文章,如果需要更多的信息,请告诉我。如果有人能提供一些帮助,我将非常感谢!
1条答案
按热度按时间x8goxv8g1#
我可以通过创建一个ALTER语句来解决这个问题,首先将该列设置为TEXT,然后像处理S_DATE那样将date_format和str_to_date组合在一起。但我仍然不确定为什么我必须对一个列而不是另一个列这样做。