字段为空的str_to_date()函数出现问题

2024-10-04 05:23:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在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));

Tags: cityagedateitempidnullnotesstate
2条回答

您可以在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));

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函数

相关问题 更多 >