有客自远方来52 2024-04-20 22:33 采纳率: 15.3%
浏览 1
已结题

如何成功修改数据保存到数据库?(语言-python|开发工具-pycharm)

以下是我的代码,我的希望是修改随便修改某一项数据,到为什么更新数据时出现了错误,而且错误是无限的列名None
相关类

class Tea:
    # 编号
    TID = None
    # 姓名
    Tname = None
    # 年龄
    Tage = None
    # 性别
    Tsex = None
    # 联系电话
    Tphone = None
    # 住址
    Taddress = None
    # 用户名
    Tuser = None
    # 密码
    Tpassword = None

    def __init__(self, Tname,Tuser,Tpassword):
        self.Tname = Tname
        self.Tuser = Tuser
        self.Tpassword=Tpassword

    @staticmethod
    def my_construtor(Tname,Tage, Tsex, Tphone, Taddress, Tuser, Tpassword):
        obj = Tea(Tname,Tuser,Tpassword)
        obj.Tage = Tage
        obj.Tsex = Tsex
        obj.Tphone = Tphone
        obj.Taddress = Taddress
        obj.Tpassword = Tpassword
        return obj


数据库更新代码

def update(tea: Tea) -> int:
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        # 更新数据
        sql = f"update Teacher set Tname='{tea.Tname}',Tage='{tea.Tage}',Tsex='{tea.Tsex}',Tphone='{tea.Tphone}'," \
              f"Taddress='{tea.Taddress}' where TID={tea.TID}"
        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)

返回的错误
更新数据时发生错误: (207, b"Invalid column name 'None'.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n")

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-20 22:47
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:为什么在更新数据时出现了错误"Invalid column name 'None'"? 解答: 根据错误提示信息“Invalid column name 'None'”,我们可以看出问题出在了列名上。在SQL语句中,执行更新操作需要指定需要更新的列名,但是在这里出现了'None',也就是说,出现了一个不存在的列名。 回到代码中,我们可以看到,在Tea类中定义了一些属性,比如TID、Tname、Tage等等,这些属性都在更新操作中被使用到了。但是,在类的定义中,这些属性都没有被初始化,也就是说,它们的值都为None。在进行更新操作时,如果实例化的对象中,有属性的值为None,那么执行sql语句时,就会出现'None'变量,也就是没有定义的列名,导致更新操作失败。 因此,我们需要在实例化Tea对象时,对每个属性进行初始化赋值,或者在update函数中,进行判断,如果属性为None,则不更新该列数据。 代码示例: 调用my_constructor初始化属性 class Tea:
    # 编号
    TID = None
    # 姓名
    Tname = None
    # 年龄
    Tage = None
    # 性别
    Tsex = None
    # 联系电话
    Tphone = None
    # 住址
    Taddress = None
    # 用户名
    Tuser = None
    # 密码
    Tpassword = None
    
    def __init__(self, TID, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword):
        self.TID = TID
        self.Tname = Tname
        self.Tage = Tage
        self.Tsex = Tsex
        self.Tphone = Tphone
        self.Taddress = Taddress
        self.Tuser = Tuser
        self.Tpassword = Tpassword
    
    @staticmethod
    def my_construtor(Tname,Tage, Tsex, Tphone, Taddress, Tuser, Tpassword):
        obj = Tea(None, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword)
        return obj
    

    在update函数中进行判断 def update(tea: Tea) -> int: con = None try: con = dbUtil.getCon() cursor = con.cursor()

        # 更新数据
        sql = f"update Teacher set Tname='{tea.Tname}',"
        if tea.Tage:
            sql += f"Tage='{tea.Tage}',"
        if tea.Tsex:
            sql += f"Tsex='{tea.Tsex}',"
        if tea.Tphone:
            sql += f"Tphone='{tea.Tphone}',"
        if tea.Taddress:
            sql += f"Taddress='{tea.Taddress}',"
        sql = sql[:-1] # 去除最后一个逗号
        sql += f" where TID={tea.TID}"
        
        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)
    
    评论

报告相同问题?

问题事件

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

悬赏问题

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