【发布时间】:2011-09-30 21:26:02
【问题描述】:
我可能遗漏了一些明显的东西,但我无法弄清楚我的代码与我在 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
【问题讨论】:
标签: python mysql-python