我目前正在使用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 | |
+-------+---------+------+-----+---------+-------+
1条答案
按热度按时间332nm8kg1#
这是因为当mysql连接器将变量注入sql语句时,它会根据它们的类型对它们进行格式化。
您可以在收到的错误消息中看到:
因此,您的sql查询可能如下所示:
语法上无效的sql。。。
不过,你的第二个选择似乎还可以。顺便说一句,根据用户的输入调整要选择的列似乎很奇怪。。。我强烈建议用一些有效的方法来验证这个值。。。
详细信息
你不能使用
%s
因为这会在sql查询中注入字符串值,从而导致无效的sql语法(列名不是字符串值)。如上所述:
生成:
这是无效的,因为您试图将一个值影响为另一个值。。。
这与在python中尝试执行以下操作相同:
或
你可以用
%s
设置值时(使用SET colName = %s
)或过滤值(使用WHERE colName = %s
)因为列中值的类型colName
实际上是一个字符串。如上所述:
生成:
这是有效的,因为您筛选的值等于字符串
fooBar
.顺便说一下,你可能想看看
结果给了你。可能会导致问题。。。实际上mysql不会告诉您任何事情,但是您的结果可能正是
itemCode
. (它是有效的sqlSELECT 'hello'
,它就回来了'hello'
).