Попытка взять дату в качестве ввода в python и обновить значение в таблице mysql, используя соединитель mysql - PullRequest
0 голосов
/ 22 апреля 2020

Моя цель здесь - обновить существующую таблицу в базе данных mysql, взяв все переменные для оператора обновления в качестве входных данных от пользователя. Я использую mysqlconnector для взаимодействия с python.

    coltbu=input("Now enter the name of the column whose value for that row/condition is to be updated")
    if coltbu=="dob":
        y1=input("Enter the value to be set for date of joining in yyyy-mm-dd")    
    elif col=="id":
        nval=int(input("Enter the value to be set for salary"))  
    else:
        nval=input("Enter the value to be set for this column")
    x='%d-%m-%Y'
    tup=(coltbu,y1,x,col,val)
    print(tup)
    cursor1.execute("Update student set %s=str_to_date(%s,%s) where %s=%s"%tup)
    con1.commit()
    con1.close()

У меня есть много вариантов после тщательного поиска решений на inte rnet, но я не могу найти ничего, что работает. Некоторая ошибка или другое всегда появляется. В этом случае я использую таблицу изображение таблицы

Команда, которую я пытаюсь выполнить, update student set dob='2003-09-12' where id=6;

I также пытался использовать datetime, чтобы это работало.

    coltbu=input("Now enter the name of the column whose value for that row/condition is to be updated")
    if coltbu=="dob":
        y=int(input("Enter the value to be set for dob in yyyy/mm/dd. First enter year and hit enter"))
        m=int(input("Now enter month"))
        d=int(input("Now enter date"))
        nval=datetime.date(datetime(y,m,d))    
    elif col=="id":
        nval=int(input("Enter the value to be set for id"))  
    else:
        nval=input("Enter the value to be set for this column")
    tup=(int(coltbu,nval,col,val)
    print(tup)
    cursor1.execute("Update student set %s=%s where %s=%s"%tup)
    con1.commit()
    con1.close()

Но это породило действительно странную ошибку. Было бы сказано

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 489, in cmd_query
    raw_as_string=raw_as_string)
_mysql_connector.MySQLInterfaceError: Incorrect date value: '1993' for column 'dob' at row 4

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/aliziamojiz/Documents/Alizia/12/prac1.py", line 118, in <module>
    f4()
  File "/Users/aliziamojiz/Documents/Alizia/12/prac1.py", line 113, in f4
    cursor1.execute("Update student set %s=%s where %s=%s"%tup)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mysql/connector/cursor_cext.py", line 266, in execute
    raw_as_string=self._raw_as_string)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 492, in cmd_query
    sqlstate=exc.sqlstate)
mysql.connector.errors.DataError: 1292 (22007): Incorrect date value: '1993' for column 'dob' at row 4

, тогда как я нигде не вводил 1993 ни в своем коде, ни в введенном мною вводе.

Я застрял сейчас. Как взять дату в качестве ввода в программе python и использовать ее в команде обновления для таблицы mysql. Пожалуйста, помогите. Заранее спасибо:)

1 Ответ

0 голосов
/ 24 апреля 2020

То, как вы используете datetime для получения даты, кажется странным. strptime выдаст ValueError, если формат даты не соответствует ожидаемому или если дата недействительна. Обычно он используется следующим образом:

dateInput = input("Enter the value to be set for dob in the format yyyy/mm/dd: ")
try:
    dateObject = datetime.strptime(dateInput, "%Y/%m/%d")
except ValueError:
    raise ValueError("WRONG DATE FORMAT!")

И после этого вы можете использовать дату ввода для обновления таблицы с помощью dateObject.date().
Кроме того, я также предлагаю разделить значения в SQL запрос (для предотвращения SQL внедрения) при использовании execute, например:

queryValues = (str(dateObject.date()). idInput)
cursor1.execute("UPDATE student SET dob=%s WHERE id=%s", queryValues)
...