Jil*_*l S 4 python mysql mysql-error-1054
嘿所有,我收到了一个错误
OperationalError:(1054,"where子句'中的未知列'XX'")
其中XX是以下代码中CLASS的值
conn = MySQLdb.connect(host = "localhost",user = "user", passwd = "pass",db = "dbase")
cursor = conn.cursor()
cursor.execute("""SELECT * FROM %s WHERE course =%s AND sec = %s""" % (str(DEPT),str(CLASS),str(SEC),))
Run Code Online (Sandbox Code Playgroud)
问题是,我只用某些值得到这个错误,即当CLASS包含一个字母时.如果有帮助,我将表设置为varchar
谢谢!
不要在SQL中使用"字符串注入",除非它确实是必不可少的,例如在str(DEPT)这里选择你正在选择的表.对于其他所有情况,请使用Python DB API的参数传递功能 - 它将为您正确引用内容并自动防御"SQL注入"攻击等.(有时也可能更快).
由于MySQLdb %s对参数使用了不幸的表示法,所以这是你应该做的(也将样式修改为PEP8兼容,不是必需但不能伤害;-):
conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))
Run Code Online (Sandbox Code Playgroud)
%%在格式化时生成的字符串格式中的s q变为单个%格式,因此q剩下两次出现%s- 其中execute正确填充正确格式化的CLASS和SEC.所有的str电话都是多余的,等等.
顺便说一句,如果您使用的是Python 2.6或更高版本,那么对于字符串格式化,您应该使用新format方法而不是旧%操作符 - 这样可以使您免于那些"加倍%符号"的需要,以及其他优点.我没有在上面的代码片段中应用这个更改,以防您遇到2.5或更早版本(因此上面的代码适用于任何版本的Python,而不仅仅是合理的最新版本).
| 归档时间: |
|
| 查看次数: |
11373 次 |
| 最近记录: |