尝试将日期作为python中的输入并使用mysql连接器更新mysql表中的值

Posted

技术标签:

【中文标题】尝试将日期作为python中的输入并使用mysql连接器更新mysql表中的值【英文标题】:Trying to take a date as input in python and updating value in mysql table using mysql connector 【发布时间】:2020-08-05 08:57:55 【问题描述】:

我的目标是更新 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()

在互联网上苦苦搜索解决方案后,我有很多变化,但我似乎找不到任何有效的方法。一些错误或其他总是出现 在这种情况下,我使用的表是 image of table

我要执行的命令是 update student set dob='2003-09-12' where id=6;

我也尝试使用 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 表的更新命令中使用它。 请帮忙。 在此先感谢:)

【问题讨论】:

我建议将您提供的代码缩短到您遇到问题的部分。一个可重现的最小工作示例。这么多代码让人分心。至于您的问题,使用datetime 模块是最好的方法。您可以查看strptime 函数,如codereview.stackexchange.com/questions/200634/… 中接受的答案的最后一部分所述 非常感谢@CibinJoseph。我确实尝试减少代码量。请看看现在是否更清楚了。我确实检查了strptime 函数,但我不确定你为什么觉得它会解决我的问题。据我了解,它检查给定/输入日期的有效性。 【参考方案1】:

您使用 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()。 此外,我还建议您在使用execute 时将 SQL 查询中的值分开(以防止 SQL 注入),如下所示:

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

【讨论】:

以上是关于尝试将日期作为python中的输入并使用mysql连接器更新mysql表中的值的主要内容,如果未能解决你的问题,请参考以下文章

将mysql数据作为数组检索并显示在多个组合框中

如何在python子进程模块中执行用户输入(如日期)作为命令[重复]

将日期和时间与 MySQL 中的当前时间进行比较

如何使用 Selenium 和 Python 在信用卡号字段中输入日期?

如何从 html 表单中获取“日期和时间”输入并使用 Spring Boot 保存到 MySQL 数据库中?

无法将时间和数据作为输入并写入使用 Hasura GraphQL 实现的数据库