Возможно, мне не хватает чего-то очевидного, но я не могу понять, чем мой код отличается от различных примеров, которые я вижу в онлайн-документации для 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, на предмет правильного синтаксиса для использования рядом с« 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