Python,MySQLdb和转义表名?

Twi*_*rim 7 python mysql-python

我可能会遗漏一些明显的东西,但我无法弄清楚我的代码与我在MySQLdb的在线文档中看到的各种示例有何不同.

我是编程python的新手,对perl更有经验.我想要做的是尽早养成一些好习惯(比如perl我总是从'use strict; use warnings'开始),所以我试图确保我在一个独立的文件中创建可重用的函数( funct.py)以节省我的时间.

我有这个函数用于从表中选择随机行:

def returnRandom(conn,countcol,table,field):
    cursor = conn.cursor()
    cursor.execute('SELECT MAX(%s) FROM %s',(countcol,table))
    maxRow = cursor.fetchone()[0]
    cursor.execute("SELECT MIN(%s) FROM %s",(countcol,table))
    minRow = cursor.fetchone()[0]
    randomId = random.randrange(minRow,maxRow+1,1)
    cursor.execute("SELECT ? FROM ? WHERE id >=? LIMIT 1",field,table,randomId)
    return cursor.fetchone()[0]
Run Code Online (Sandbox Code Playgroud)

它被称为这样:

msg = funct.returnRandom(conn,"id","testtable","data")
Run Code Online (Sandbox Code Playgroud)

不幸的是它出错了:_mysql_exceptions.ProgrammingError:(1064,"你的SQL语法有错误;请查看与你的MySQL服务器版本相对应的手册,以便在第1行''testtable''附近使用正确的语法")

如果我在执行行上放置testtable代替%s,查询将运行但看起来它运行

SELECT MAX('id') FROM testtable;
Run Code Online (Sandbox Code Playgroud)

当然返回'id'.

考虑到这两者,当它试图执行它们时,它会引用%s条目.我想知道是否有人可以解释我是如何让它停止这样做的,或者我应该如何实际做我想要实现的目标?我希望函数尽可能通用,因此依赖于在调用它时传递给它的数据.

编辑:我应该补充,如果我替换?分数:

....
    cursor.execute('SELECT MAX(?) FROM ?',(countcol,table))
File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 151, in execute
    query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 3

您不能使用 DB-API 来获取元数据;您需要在通话之外自行更换execute()

query = 'SELECT MAX(%%s) FROM `%s`' % (table,)
cursor.execute(query, (countcol,))
Run Code Online (Sandbox Code Playgroud)

table显然,如果来自外部来源,您不应该这样做。

  • 理想情况下,这就是我试图避免的。我已经使用 format 函数实现了类似的功能,但我想做得更安全一些。 (3认同)