有客自远方来52 2024-04-22 16:28 采纳率: 15.3%
浏览 3
已结题

如何将日期数据正确插入?(语言-python|开发工具-pycharm)

我想实现日期的增加,使用了DATEADD函数,但返回的错误显示日期是已经增加完成后但无法再插入数据库的问题?该如何修改?
数据库代码模块

def update(rbook: Rbook) -> int:
    """
    更新数据
    :param s_book:
    :return:
    """
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        # 更新数据
        sql = f"UPDATE borrow set returnDate= DATEADD(day,7,returnDate) where bid='{rbook.bid}'"
        cursor.execute(sql)
        con.commit()
        return cursor.rowcount
    except Exception as e:
        print(f"更新数据时发生错误: {e}")
        if con is not None:
            con.rollback()
        return 0
    finally:
        dbUtil.closeCon(con)

逻辑功能实现模块

def update(self):
    datestr = self.timeInput.text()
    date_time_obj = datetime.strptime(datestr, '%Y-%m-%d')
    new_date = (date_time_obj + timedelta(days=7)).strftime('%Y-%m-%d')
    borrow2 = Rbook.my_construtor2(None, None, None, new_date)
    if borrowDao.add(borrow2) > 0:
        self.x = show_custom_message_box("系统提示", "续借成功!")
        self.resetForm()
        self.initTable()
    else:
        self.x = show_custom_message_box("系统提示", "续借失败!")

返回的错误
Conversion failed when converting the varchar value '2024-05-03' to data type int

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-22 16:28
    关注

    引自免费微信小程序:皆我百晓生

    根据你提供的信息,错误提示显示转换失败,原因是尝试将一个字符串('2024-05-03')转换为整数类型。这通常是因为在SQL语句中的某个地方,你可能意外地将日期值与整数进行了操作。

    首先,我们需要检查SQL语句中的returnDate字段是否被错误地处理成了整数。从你的代码来看,这个部分看起来是正确的,因为你在设置SQL时已经明确指定了日期格式。但是为了确保没有其他地方出错,我们可以对整个过程进行一些调整。

    1. 在逻辑功能实现模块中,确保在构造新的Rbook对象时,new_date变量的值是字符串格式,这样在传递给数据库时可以正确识别为日期类型。
    2. 在数据库代码模块中,添加异常处理来捕获特定的SQL错误,以便更准确地定位问题。

    下面是修改后的代码:

    import traceback
    
    # 数据库代码模块
    def update(rbook: Rbook) -> int:
        """
        更新数据
        :param s_book:
        :return:
        """
        con = None
        try:
            con = dbUtil.getCon()
            cursor = con.cursor()
            # 更新数据
            sql = f"UPDATE borrow SET returnDate = DATEADD(day, 7, returnDate) WHERE bid = %s"
            cursor.execute(sql, (rbook.bid,))
            con.commit()
            return cursor.rowcount
        except Exception as e:
            error_traceback = traceback.format_exc()
            print(f"更新数据时发生错误: {error_traceback}")
            if con is not None:
                con.rollback()
            return 0
        finally:
            dbUtil.closeCon(con)
    
    # 逻辑功能实现模块
    def update(self):
        datestr = self.timeInput.text()
        date_time_obj = datetime.strptime(datestr, '%Y-%m-%d')
        new_date = (date_time_obj + timedelta(days=7)).strftime('%Y-%m-%d')
        
        # 确保new_date始终为字符串
        borrow2 = Rbook.my_construtor2(None, None, None, str(new_date))
    
        try:
            if borrowDao.add(borrow2) > 0:
                self.x = show_custom_message_box("系统提示", "续借成功!")
                self.resetForm()
                self.initTable()
            else:
                self.x = show_custom_message_box("系统提示", "续借失败!")
        except Exception as e:
            error_traceback = traceback.format_exc()
            print(f"在执行add操作时发生错误: {error_traceback}")
    

    在这个版本中,我们做了两个主要的更改:

    • 将SQL语句中的占位符 %s 用于参数化查询,以防止SQL注入攻击,并确保bid字段作为字符串传递。
    • 添加了try-except块来捕获在调用borrowDao.add(borrow2)时可能出现的任何异常,同时打印出详细的错误追踪信息。

    现在,你应该能更好地理解错误发生的上下文,从而找出问题所在。如果你仍然遇到问题,查看控制台输出的错误追踪信息会有所帮助。如果错误仍然存在且与日期无关,那么问题可能在于连接数据库、查询语法或其他未展示的部分。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月22日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求