微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Python 和 mySQL 进行动态 SQL 查询

如何解决使用 Python 和 mySQL 进行动态 SQL 查询

我有多个表,这些表在网格中的值更改后更新。这些表并不总是具有相同的键或列,因此我无法明确命名列或格式。唯一不变的是键所在的列。我知道我目前这样做的方式是不正确的,这让我容易受到注入攻击。

我还遇到了一个问题,其中某些值包含在 sql 语句中引发错误的键。例如,更新 WHERE email = t'est@email.com

我不太确定写这些语句的正确方法。我做了一些研究,看到了用于不同目的的多种方法,但不确定哪种方法合适。我希望尽可能动态地执行此操作。有人能指出我正确的方向吗?

连接:

import MysqL.connector as sql
import MysqLdb

#Connect
self.db_name = 'database'
        self.server = 'server'
        self.user_id = 'user'
        self.pw = 'password'

        try:
            self.db_con = MysqLdb.connect(user=self.user_id,password=self.pw,database=self.db_name,host=self.server,charset='utf8',autocommit=True)
            self.cursor = self.db_con.cursor()
        except:
            print("Error connecting")    

sql 语句:

key_id =  str("'") + self.GetCellValue(event.GetRow(),1) +  str("'")    
        target_col = self.GetColLabelValue(event.GetCol())
        key_col = self.GetColLabelValue(1)                                     
        nVal = str("'") + self.GetCellValue(event.GetRow(),event.GetCol()) +  str("'")

#sql STATEMENTS
        sql_update = "UPDATE " + tbl + " SET " +  target_col + " = " + nVal + " WHERE " + key_col  +  " = " + key_id + ""
        

#INSERT
        sql_update = ("INSERT INTO " + str(self.tbl) + "(" + self.key_col + ")" + "VALUES (" + str("'") + str(val) + str("'") + ")")

#DELETE
        sql_update = "DELETE FROM " + tbl + " WHERE " + self.key_col + " = " + self.key_id + ""

#SELECT
        sql_query = "SELECT * FROM " + self.tbl 

#Excecute
        try:
            self.cursor.execute(sql_update)
            
            
        except:
            print('Error')
            self.db_con.rollback()

解决方法

数据库对于“引用”enter image description here(表名和列名等)和(数据)有不同的表示法。

MySQL 使用反引号来引用标识符。对于值,最好使用连接器包提供的参数替换机制:这样更有可能正确处理嵌入引号等棘手情况,并且会降低 SQL 注入的风险。

这是插入的示例;相同的技术可用于其他类型的查询。

key_id =  str("'") + self.GetCellValue(event.GetRow(),1) +  str("'")    
target_col = self.GetColLabelValue(event.GetCol())
key_col = self.GetColLabelValue(1)                                     
nVal = str("'") + self.GetCellValue(event.GetRow(),event.GetCol()) +  str("'")
        

#INSERT (using f-strings for brevity)
sql_update = (f"INSERT INTO `{self.tbl}` (`{self.key_col}`) VALUES (%s)")

# Pass the statement and values to cursor.execute.  
# The values are assumed to be a sequence,so a single value should be 
# placed in a tuple or list.
self.cursor.execute(sql_update,(nVal,))

如果您有多个列/值对,您可以执行以下操作:

cols = ['A','B','C']
vals = ['a','b','c']

col_names = ','.join([f'`{c}`' for c in cols])
values_placeholder = ','.join(['%s'] * len(cols))

sql_update = (f"INSERT INTO `{self.tbl}` (col_names) VALUES ({values_placeholder})")
self.cursor.execute(sql_update,vals)

值不仅是用于插入的数据,也是我们用于比较的数据,例如在 WHERE 子句中。因此,可以像这样创建带有过滤器的更新语句:

sql_update = (f"UPDATE `{tbl}` SET (`{target_col}`) = (%s) WHERE (`{key_col}`) = %s")
self.cursor.execute(sql_update,key_id))

然而,有时 SETWHERE 子句的目标可能是一列,例如我们想根据行中的其他值进行更新。例如,对于所有 target_col 等于 other_col 的行,此语句会将 key_col 设置为 other_key_col 的值:

sql_update = (f"UPDATE `{tbl}` SET (`{target_col}`) = `{other_col}` WHERE (`{key_col}`) = `{other_key_col}`")
self.cursor.execute(sql_update)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?