mysql connector python变量未注册

rjzwgtxy  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(270)

我目前正在使用mysql connector python包在flask上执行数据库操作。它一直工作得很好,直到突然变量似乎不再正常工作。我的代码在这里:

@bp.route('/addcart', methods=('OPTIONS', 'POST'))
def addcart():
        ...
        userID = session.get("user_id")
        reqDict = request.get_json()
        itemCode = str(reqDict['itemCode'])
        itemAmt = reqDict['itemAmt']

        if userID is not None:
            db = get_db()
            cursor = db.cursor()
            query = ('SELECT %s FROM cartdata WHERE id = %s')

            cursor.execute(query, (itemCode, userID))
            currentNum = cursor.fetchone()[0]

            if currentNum is None:
                stmt = ('UPDATE cartdata SET %s = 1 WHERE id = %s')
                cursor.execute(stmt, (itemCode, userID))
            else:
                currentNum = int(currentNum) + int(itemAmt)
                stmt = ('UPDATE cartdata SET %s = %s WHERE id = %s')
                cursor.execute(stmt, (itemCode, currentNum, userID))
            ....

出于某种原因,我似乎在使用itemcode变量时遇到了问题。当我正确地使用它时,比如在执行'query'或'stmt'时,它就不起作用了。通常我会得到一个错误说
“您的sql语法有错误;检查与您的mysql服务器版本对应的手册,以获得在“p1”=1,其中id=21”附近使用的正确语法。
但是,如果我这样做:

query = ('SELECT ' + itemCode + ' FROM cartdata WHERE id = %s')
...
stmt = ('UPDATE cartdata SET '+ itemCode +' = 1 WHERE id = %s')
...

它按预期正常工作。
编辑:我已经检查了我的后端,显然update语句实际上并没有更新任何内容。所以现在我完全不知所措。
我不明白为什么现在连接器突然断开了。我已经检查了这个变量及其类型,但它们是预期的类型。任何见解都会有帮助。
“cartdata”的表架构如下所示:

+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
| p1    | int(8)  | YES  |     | NULL    |       |
| p2    | int(8)  | YES  |     | NULL    |       |
| p3    | int(8)  | YES  |     | NULL    |       |
| p4    | int(8)  | YES  |     | NULL    |       |
| p5    | int(8)  | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
332nm8kg

332nm8kg1#

这是因为当mysql连接器将变量注入sql语句时,它会根据它们的类型对它们进行格式化。
您可以在收到的错误消息中看到:

"p1' = 1 WHERE id = 21'"
  ^

因此,您的sql查询可能如下所示:

SELECT 'p1' FROM cartdata WHERE id = someId

语法上无效的sql。。。
不过,你的第二个选择似乎还可以。顺便说一句,根据用户的输入调整要选择的列似乎很奇怪。。。我强烈建议用一些有效的方法来验证这个值。。。

详细信息

你不能使用 %s 因为这会在sql查询中注入字符串值,从而导致无效的sql语法(列名不是字符串值)。
如上所述:

SET %s = ...

生成:

SET 'colName' = ...

这是无效的,因为您试图将一个值影响为另一个值。。。
这与在python中尝试执行以下操作相同:

'foo' = 'bar'

'foo' = 4

你可以用 %s 设置值时(使用 SET colName = %s )或过滤值(使用 WHERE colName = %s )因为列中值的类型 colName 实际上是一个字符串。
如上所述:

WHERE colName = %s

生成:

WHERE colName = 'fooBar'

这是有效的,因为您筛选的值等于字符串 fooBar .
顺便说一下,你可能想看看

SELECT %s FROM cartdata WHERE id = %s

结果给了你。可能会导致问题。。。实际上mysql不会告诉您任何事情,但是您的结果可能正是 itemCode . (它是有效的sql SELECT 'hello' ,它就回来了 'hello' ).

相关问题