使用 mySQL 原始数据库查询进行 Python 字符格式化给我带来了问题

标签 python mysql sql format

我在尝试在网络应用程序上安装搜索功能时遇到问题。问题出在下面的代码上。我已经尝试了以下两个查询,但 python 给了我一个错误,我将在下面列出:

def searchBox(user_id, searchparams):

try:
    cursor = connection.cursor()

    if cursor:
        sql = "SELECT * FROM db_email WHERE user_id = %d AND deleted = 0 AND subject LIKE '%%%s%%';"
        cursor.execute(sql % (user_id, searchparams)

我也尝试过:

try:
    cursor = connection.cursor()

    if cursor:
        sql = "SELECT * FROM db_email WHERE user_id = %d AND deleted = 0 AND subject LIKE " + "'%" + searchparams + "%';"
        cursor.execute(sql % (user_id))

两者都为我返回此错误:

TypeError: not enough arguments for format string

这是我遇到问题的唯一原始查询,它与我需要调用 LIKE 的方式有关。我可以编写一个存储过程来绕过 python,但我觉得我在做一些愚蠢的事情并忽略了一个问题。任何帮助将不胜感激


谢谢。我认为问题的一部分在于我的 LIKE 查询,我需要我的搜索参数用百分号括起来,而下面的答案不能像这样工作 -

subject LIKE '%somestringimlookingfor%' 

使用上面的代码似乎可以“测试”%''。有什么想法吗?

最佳答案

不要对 SQL 查询使用字符串插值,这是完全不安全的。

相反,使用查询参数:

sql = """SELECT 
             * 
         FROM 
             db_email 
         WHERE
             user_id = %s AND 
             deleted = 0 AND 
             subject LIKE '%%%s%%'"""
cursor.execute(sql, (user_id, searchparams))

百分号应使用%转义。

更新:

略有不同的选项:

sql = """SELECT 
             * 
         FROM 
             db_email 
         WHERE
             user_id = %s AND 
             deleted = 0 AND 
             subject LIKE %s"""
cursor.execute(sql, (user_id, "%" + searchparams + "%"))

另请参阅:

关于使用 mySQL 原始数据库查询进行 Python 字符格式化给我带来了问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19051661/

相关文章:

python - 创建 github 存储库

python - 比较 Pandas Dataframe 行和删除具有重叠日期的行

python - 如何修复运行时错误: deque mutated during iteration in Python

java - 非法访问 : this web application instance has been stopped already

php - 将多维数组信息插入数据库

mysql - 为每个键值对选择前 n 行

php - 选择两个表中的数据

python - matplotlib 中的离散密度图

php - 在laravel中添加引用外键的表时出现错误如何解决?

python插入和检索二进制数据到mysql