【问题标题】:How to pass a variable to MySQL's LIMIT clause?如何将变量传递给 MySQL 的 LIMIT 子句?
【发布时间】:2017-05-11 21:33:12
【问题描述】:

我正在尝试使用 pymysql 对 Mysql 数据库进行 SELECT 语句。 这是代码。我将一个变量传递给 select 语句,令我惊讶的是,这是一个巨大的痛苦。知道我在这里缺少什么吗?

def getUrlFromDatabase(n):
    stmt = "SELECT * FROM jsonTes ORDER BY website LIMIT %s-1,1"
    cur.execute(stmt,str(n))
    return cur.fetchone()

conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='passwd', db='email_database', charset='utf8')
cur = conn.cursor()
cur.execute("USE database")

getUrlFromDatabase(0)

错误:

这是我试图实现的目标:Return the nth record from MySQL query

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''0'-1,1' at line 1")

【问题讨论】:

    标签: python mysql pymysql


    【解决方案1】:

    LIMIT 在 MySQL 中采用数字参数,它们都必须是非负整数常量。您必须在 Python 中计算表达式,然后将整数作为单个参数传递。此外,您需要将参数放在一个元组中:

    def getUrlFromDatabase(n):
        stmt = "SELECT * FROM jsonTes ORDER BY website LIMIT %s, 1"
        cur.execute(stmt, (n-1 if n > 0 else 0,))
        return cur.fetchone()
    

    【讨论】:

    • 感谢您的光临。我尝试了您的代码,但仍然出现错误:pymysql.err.ProgrammingError: (1064, “您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,以了解在 ' 附近使用的正确语法-1, 1' 在第 1 行")
    • 仍然收到错误 :D pymysql.err.ProgrammingError: (1064, "您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册以获取正确的语法以在附近使用'-1, 1' 在第 1 行")
    • 参数应该是非负数。尝试更新。
    • "MySQL 中的LIMIT 接受数字参数,必须都是非负 整数"
    【解决方案2】:

    您没有以字符串格式为 %s 传递值 1。 stmt = "SELECT * FROM jsonTes ORDER BY website LIMIT %s" %n 用于限制 n

    【讨论】:

    • 不是字符串格式化,是dbapi SQL查询占位符。该值将(与查询一起)传递给cursor.execute(),并将进行适当的清理以避免 SQL 注入。
    • 但错误是right syntax to use near ''0'-1,1'。但是如果你可以将它格式化为字符串并执行,它不会工作吗?然而,没有在执行中传递额外的参数。 @brunodesthuilliers
    • 错误是 OP 将字符串(而不是具有单个 int 的元组)作为参数传递给 execute()。是的,使用字符串格式在这里工作(技术上),但这是一个巨大的安全问题:bobby-tables.com
    • 有问题!但我不认为这是安全风险。你能详细说明吗? @brunodesthuilliers
    • 任何可能允许 SQL 注入的东西都是安全问题。这种特殊情况可能不是什么大问题(即使那样我也不会打赌我的用户会以此为基础),但考虑到有多少新手不知道这个问题,建议在这里简单的字符串格式对他们造成很大的伤害.
    【解决方案3】:

    你可以这样使用

    def getUrlFromDatabase(n):
        stmt = "SELECT * FROM jsonTes ORDER BY website LIMIT {}, 1"
        cur.execute(stmt.format(n-1 if n > 0 else n))
        return cur.fetchone()
    

    【讨论】:

    • 感谢您的光临。收到错误消息: pymysql.err.ProgrammingError: (1064, “您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的 '-1, 1' 附近使用的正确语法")
    • 你能详细说明你想在这里设置什么限制吗?
    • n 将从 0 循环到 1000。我从 0 开始。
    猜你喜欢
    • 2019-07-10
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2010-09-09
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多