gpt4 book ai didi

Python、MySQLdb 和转义表名?

转载 作者:太空狗 更新时间:2023-10-29 21:59:01 25 4
gpt4 key购买 nike

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

我是 Python 编程的新手,对 Perl 比较有经验。我想做的是尽早养成某些良好的习惯(比如在 perl 中我总是从“使用严格;使用警告”开始),所以我试图确保我在一个独立的文件中创建可重用的函数( 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]

它是这样调用的:

msg = funct.returnRandom(conn,"id","testtable","data")

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

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

SELECT MAX('id') FROM testtable;

当然会返回“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

最佳答案

您不能将 DB-API 用于元数据;您需要在 execute() 调用之外自己进行替换。

query = 'SELECT MAX(%%s) FROM `%s`' % (table,)
cursor.execute(query, (countcol,))

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

关于Python、MySQLdb 和转义表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6618344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com