在python和sql中使用row作为变量
我正在尝试将一些值更新到数据库中。用户可以指定应更改的行。然而,来自用户的输入是一个字符串。当我试图用python将其解析到MySQL连接器中时,由于撇号的原因,它给出了一个错误。到目前为止,我掌握的代码是:在python和sql中使用row作为变量,python,mysql,sql,string,python-3.x,Python,Mysql,Sql,String,Python 3.x,我正在尝试将一些值更新到数据库中。用户可以指定应更改的行。然而,来自用户的输入是一个字符串。当我试图用python将其解析到MySQL连接器中时,由于撇号的原因,它给出了一个错误。到目前为止,我掌握的代码是: import mysql.connector conn = mysql.connector conn = connector.connect(user=dbUser, password=dbPasswd, host=dbHost, database=dbName) cursor
import mysql.connector
conn = mysql.connector
conn = connector.connect(user=dbUser, password=dbPasswd, host=dbHost, database=dbName)
cursor = conn.cursor()
cursor.execute("""UPDATE Search SET %s = %s WHERE searchID = %s""", ('maxPrice', 300, 10,))
我得到这个错误
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''maxPrice' = 300 WHERE searchID = 10' at line 1
我如何去掉撇号?因为我认为它们会导致问题。列名不是参数。将列名
maxPrice
直接放入SQL中
cursor.execute("""UPDATE Search SET maxPrice = %s WHERE searchID = %s""", (300, 10))
如果要使用具有不同列名的相同代码,则必须修改字符串本身
sql = "UPDATE Search SET {} = %s WHERE searchID = %s".format('maxPrice')
cursor.execute(sql, (300,10))
但请记住,这并不像参数那样安全,因此请确保列名不是用户输入字符串或类似的内容 你不能那样做。在调用
游标之前,需要将列名放入字符串中。执行。在游标中转换变量时不能使用列名。请执行
类似这样的方法会奏效:
sql = "UPDATE Search SET {} = %s WHERE searchID = %s".format('maxPrice')
cursor.execute(sql, (300, 10,))
不能动态绑定对象(例如列)名称,只能绑定值。如果这是您试图实现的逻辑,那么您必须求助于字符串操作/格式化(伴随着SQL注入攻击的所有风险)。例如:
如上所述,您不能使用字段来准备它
也许最安全的方法是只允许预期的字段,例如
#!/usr/bin/python
import os
import mysql.connector
conn = mysql.connector.connect(user=os.environ.get('USER'),
host='localhost',
database='sandbox',
unix_socket='/var/run/mysqld/mysqld.sock')
cur = conn.cursor(dictionary=True)
query = """SELECT column_name
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'Search'
"""
cur.execute(query)
fields = [x['column_name'] for x in cur.fetchall()]
user_input = ['maxPrice', 300, 10]
if user_input[0] in fields:
cur.execute("""UPDATE Search SET {0} = {1} WHERE id = {1}""".format(user_input[0], '%s'),
tuple(user_input[1:]))
print cur.statement
印刷品:
UPDATE Search SET maxPrice = 300 WHERE id = 10
其中:
mysql> show create table Search\G
*************************** 1. row ***************************
Search
CREATE TABLE `Search` (
`id` int(11) DEFAULT NULL,
`maxPrice` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
列名不是参数。将列名maxPrice
直接放入查询中。我想将该列设为参数。这可能吗?或者有解决办法吗?是的,这很有效!我确实担心SQL注入,但我想我别无选择…@JoostLuijben看到我的答案只允许有效字段
mysql> show create table Search\G
*************************** 1. row ***************************
Search
CREATE TABLE `Search` (
`id` int(11) DEFAULT NULL,
`maxPrice` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1