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)
您不能使用 DB-API 来获取元数据;您需要在通话之外自行更换execute()。
query = 'SELECT MAX(%%s) FROM `%s`' % (table,)
cursor.execute(query, (countcol,))
Run Code Online (Sandbox Code Playgroud)
table显然,如果来自外部来源,您不应该这样做。
| 归档时间: |
|
| 查看次数: |
3024 次 |
| 最近记录: |