Python CRUD:如何解决'TypeError:update_profile()在更新SQLite3数据库时缺少5个必需的位置参数'?

qij5mzcb  于 2023-05-29  发布在  SQLite
关注(0)|答案(1)|浏览(131)

我正在使用Python CRUD并试图连接到我的SQLite 3数据库,但我得到以下错误:
(类型错误:update_profile()缺少5个必需的位置参数:“姓名”、“年龄”、“性别”、“身高”和“体重”)
下面是我的代码:

def update_profile(self, name, age, gender, height, weight):
        conn = sqlite3.connect("users_db.db")
        c = conn.cursor() 
        c.execute("""UPDATE table_name SET name=?, age=?, gender=?, height=?, weight=? WHERE name=?, age=?, gender=?, height=?, weight=?""",
          (new_name, new_age, new_gender, new_height, new_weight, old_name, old_age, old_gender, old_height, old_weight))
        
        new_name = name.entry.get()
        new_age = age.entry.get()
        new_gender = gender.entry.get()
        new_height = height.entry.get()
        new_weight = weight.entry.get()
 
        
        c.execute("SELECT * FROM name=?, age=?, gender=?, height=?, weight=?, WHERE name=?, age=?, gender=?, height=?, weight=?",(new_name, new_age, new_gender, new_height, new_weight, old_name, old_age, old_gender, old_height, old_weight))
        
        datas = c.fetchall()
        for datas in datas:
            print(datas)

        conn.commit()
        conn.close()
bgtovc5b

bgtovc5b1#

您遇到的错误是TypeError,指示update_profile()函数缺少五个必需的位置参数:“姓名”、“年龄”、“性别”、“身高”和“体重”。看起来您试图从一些输入字段(entry.get())中检索这些参数的值。但是,所提供的代码有几个问题需要解决。
首先,代码中有一些缩进错误。确保update_profile()函数中的代码正确缩进。
其次,在SQL查询中,您应该使用占位符(?)来传递参数值,而不是直接将它们插入到查询字符串中。这有助于防止SQL注入攻击并确保值的正确格式。
以下是代码的更新版本,其中包含必要的更正:

import sqlite3

def update_profile(self, name, age, gender, height, weight):
    conn = sqlite3.connect("users_db.db")
    c = conn.cursor()

    new_name = name.entry.get()
    new_age = age.entry.get()
    new_gender = gender.entry.get()
    new_height = height.entry.get()
    new_weight = weight.entry.get()
    
    c.execute("""
        UPDATE table_name 
        SET name=?, age=?, gender=?, height=?, weight=? 
        WHERE name=? AND age=? AND gender=? AND height=? AND weight=?
    """, (new_name, new_age, new_gender, new_height, new_weight, old_name, old_age, old_gender, old_height, old_weight))

    c.execute("""
        SELECT * 
        FROM table_name 
        WHERE name=? AND age=? AND gender=? AND height=? AND weight=?
    """, (new_name, new_age, new_gender, new_height, new_weight))
    
    datas = c.fetchall()
    for data in datas:
        print(data)

    conn.commit()
    conn.close()

在更新的代码中,我从SELECT查询中删除了不必要的占位符,因为您不需要在查询中指定参数名称。而是在执行查询时按正确的顺序传递参数值。
请注意,在调用update_profile()函数之前,您仍然需要定义old_name、old_age、old_gender、old_height和old_weight的值。

相关问题