使用row作为变量与python和sql

问题描述 投票:2回答:4

我试图将一些值更新到数据库中。用户可以给出应该更改的行。然而,来自用户的输入是字符串。当我尝试使用python将其解析为MySQL连接器时,由于撇号而导致错误。我到目前为止的代码是:

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

我如何摆脱撇号?因为我认为他们造成了问题。

python mysql sql string python-3.x
4个回答
1
投票

如上所述,您无法使用字段进行准备。

也许最安全的方法是仅允许那些预期的字段,例如,

#!/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

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))

但请记住,注入参数的方式不安全,因此请确保您的列名不是用户输入的字符串或类似的东西。


1
投票

你不能这样做。在调用cursor.execute之前,需要将列名放在字符串中。在cursor.execute中转换变量时,不能使用列名。

像这样的东西会起作用:

sql = "UPDATE Search SET {} = %s WHERE searchID = %s".format('maxPrice')

cursor.execute(sql, (300, 10,))

1
投票

您不能动态绑定对象(例如,列)名称,只能绑定值。如果这是你想要实现的逻辑,那么你必须采用字符串操作/格式化(具有随之而来的SQL注入攻击的所有风险)。例如。:

sql = """UPDATE Search SET {} = %s WHERE searchID = %s""".format('maxPrice')
cursor.execute(sql, (300, 10,))
© www.soinside.com 2019 - 2024. All rights reserved.