Python, MySQLdb и экранирование имен таблиц?

Мне может не хватать чего-то очевидного, но я не могу понять, чем мой код отличается от различных примеров, которые я вижу в онлайн-документации для 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
7
задан eandersson 7 May 2016 в 15:33
поделиться