【问题标题】:Issue with str_to_date() function with Empty field带有空字段的 str_to_date() 函数的问题
【发布时间】:2020-07-30 13:52:07
【问题描述】:

在 python 中,我试图将一些数据插入到我的表中;

   try:
        cursor.execute("INSERT INTO covid_testtable (pid, age, state, city, notes, backnotes, type, nationality, status, announced, changed) " +
                "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, STR_TO_DATE(%s, '%%d/%%m/%%Y'), STR_TO_DATE(%s, '%%d/%%m/%%Y'))",
            (pid, age, item["detectedstate"], item["detectedcity"], item["notes"], item["backupnotes"], item["typeoftransmission"],
                item["nationality"], item["currentstatus"], dateannounced, statuschanged));
    except ValueError as verr:
        print(item["dateannounced"], verr);
        break;

这一直有效,直到其中一个日期列有一个空条目。

pymysql.err.InternalError: (1411, "Incorrect datetime value: '' for function str_to_date"

我尝试将空日期的值更改为“00/00/0000”,但似乎问题出在 str_to_date() 函数上。 我可以插入 NULL 值,但是无法插入。

成功插入的有效值格式为“30/01/2020” -> “%d/%m/%Y

我的表结构如下:

create table covid_testtable ( pid int NOT NULL, age int, state VARCHAR(255), 
city VARCHAR(255), notes VARCHAR(255), backnotes VARCHAR(255), type VARCHAR(255), 
nationality VARCHAR(255), status VARCHAR(255), announced DATE default NULL, 
changed DATE default NULL,  PRIMARY KEY (pid));

编辑 2:选择的答案解决了这个问题:

def validate_date(val):
    try:
        return datetime.strptime(val, '%d/%m/%Y').strftime('%Y-%m-%d');
    except ValueError as verr:
        return None;

    dateannounced = validate_date(item["dateannounced"]);
    statuschanged = validate_date(item["statuschangedate"]);
    try:
        cursor.execute("INSERT INTO covid_testtable (pid, age, state, city, notes, backnotes, type, nationality, status, announced, changed) " +
                "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
            (pid, age, item["detectedstate"], item["detectedcity"],
                item["notes"], item["backupnotes"], item["typeoftransmission"],
                item["nationality"], item["currentstatus"], dateannounced,
                statuschanged));

【问题讨论】:

    标签: python mysql mysql-python pymysql str-to-date


    【解决方案1】:

    您可以在 Python 代码中预处理它们,而不是处理查询中的日期。例如:

    from datetime import datetime
    
    dstr = ''
    try:
        dateannounced = datetime.strptime(dstr, '%d/%m/%Y').strftime('%Y-%m-%d')
    except ValueError:
        dateannounced = None
    

    那么你的查询就变成了

    cursor.execute("INSERT INTO covid_testtable (pid, age, state, city, notes, backnotes, type, nationality, status, announced, changed) " +
                   "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                  (pid, age, item["detectedstate"], item["detectedcity"], 
                   item["notes"], item["backupnotes"], item["typeoftransmission"],
                   item["nationality"], item["currentstatus"], dateannounced, 
                   statuschanged));
    

    【讨论】:

    • @RootPhoenix 很高兴听到。我很高兴能帮上忙。将验证器编写为函数是个好主意。
    【解决方案2】:

    if()检查字符串是否为空。

    cursor.execute("""
        INSERT INTO covid_testtable (pid, age, state, city, notes, backnotes, type, nationality, status, announced, changed)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, 
                IF(%s = '', NULL, STR_TO_DATE(%s, '%%d/%%m/%%Y')), 
                IF(%s = '', NULL, STR_TO_DATE(%s, '%%d/%%m/%%Y')))""",
        (pid, age, item["detectedstate"], item["detectedcity"], item["notes"], item["backupnotes"], item["typeoftransmission"],
            item["nationality"], item["currentstatus"], dateannounced, dateannounced, statuschanged, statuschanged));
    

    请注意,我必须在参数列表中重复 dateannouncedstatuschanged,因为除了 STR_TO_DATE 函数之外,我还将它们替换到 IF 函数中。

    【讨论】:

    • 当您试图复制我的答案时,您忘记在参数列表中输入两次dateannouncedstatuschanged
    • 哦,我刚刚从您的回答中提取了 IF 语句,我的错。将更新编辑。
    • 我承担部分责任,我应该更充分地解释我在做什么。
    猜你喜欢
    • 2020-12-08
    • 2021-03-15
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多