Проблема с функцией str_to_date () с пустым полем - PullRequest
0 голосов
/ 17 апреля 2020

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

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Вместо обработки дат в запросе вы можете предварительно обработать их в своем коде 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));
0 голосов
/ 17 апреля 2020

Проверьте, является ли строка пустой, с помощью 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));

Обратите внимание, что мне пришлось повторить dateannounced и statuschanged в списке параметров, поскольку я подставляю их в * Функции 1007 * в дополнение к функциям STR_TO_DATE.

...