提问者:小点点

如何选择什么密钥更新?


我想通过使用request.data使用postman从我的sqlite3 db中选择一个要更新的字段。 但是,我收到这个错误“operationalerror at/near”?“:syntax error”。 我试过这个代码

def put(self,request,*args,**kwargs):
        connection = sqlite3.connect('/Users/lambda_school_loaner_182/Documents/job-search-be/jobsearchbe/db.sqlite3')
        cursor = connection.cursor()
        req = request.data
        for key in req:
            if key == id:
                pass
            else:
                print(key)  
                cursor.execute("UPDATE users SET ? = ? WHERE id = ?;",(key,req[key],req['id']) )
        connection.commit()
        cursor.execute("SELECT * FROM users WHERE id=?", (request.data['id'],))
        results = cursor.fetchall()
        data = []
        # if request.data['id']
        for row in results:
            object1 = {}
            col_name_list = [tuple[0] for tuple in cursor.description]
            for x in range(0,len(col_name_list) ):
                object1[col_name_list[x]] = row[x]
            data.append(object1)
        cursor.close()

        # serializer =PostSerializer(data = request.data )
        # if serializer.is_valid():
        #   serializer.save()
        return Response(data)

共1个答案

匿名用户

您将不能使用作为标识符(数据库结构,如表名和列名)。 您将需要使用字符串插值来放入列名。

f“Update users SET{key}=?WHERE id=?”

基本上用于值(用户提供的数据)。

https://docs.python.org/3/library/sqlite3.html

通常,您的SQL操作将需要使用来自Python变量的值。 您不应该使用Python的字符串操作来组装查询,因为这样做不安全; 它使您的程序容易受到SQL注入攻击(请参阅https://xkcd.com/327/以获得可能出错的幽默示例)。

相反,使用DB-API的参数替换。 放? 作为占位符,然后提供一个值元组作为游标的execute()方法的第二个参数。 (其他数据库模块可能使用不同的占位符,如%s或:1.)