Мне может не хватать чего-то очевидного, но я не могу понять, чем мой код отличается от различных примеров, которые я вижу в онлайн-документации для 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]
Она вызывается так:
msg = funct.returnRandom(conn,"id","testtable","data")
К сожалению, она выходит из строя с: _mysql_exceptions.ProgrammingError: (1064, "У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, чтобы найти правильный синтаксис рядом с '' testtable '' в строке 1")
Если я поставлю testtable вместо% s в строке выполнения. Запрос будет запущен, но похоже, что он выполняется
SELECT MAX('id') FROM testtable;
, который, конечно, возвращает 'id'.
Учитывая оба из них, похоже, что он цитирует записи% s когда он пытается их выполнить. Мне было интересно, может ли кто-нибудь объяснить, как я могу заставить это прекратить это делать, или как я на самом деле должен делать то, что пытаюсь достичь? Я хочу, чтобы функция была как можно более общей, поэтому полагаясь на данные, передаваемые ей при ее вызове.
edit: Я должен добавить, если я заменю? метки:
....
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