Python и MySQLdb: подстановка таблицы, приводящая к синтаксической ошибке - PullRequest
6 голосов
/ 22 февраля 2012

Мне нужно время от времени динамически менять таблицы и переменные, поэтому я написал такой метод python:

    selectQ ="""SELECT * FROM  %s WHERE %s = %s;""" 
    self.db.execute(selectQ,(self.table,self.columnSpecName,idKey,))
    return self.db.store_result()

Однако это приводит к исключению синтаксической ошибки.Я попытался отладить его, поэтому я напечатал переменные в методе и заполнил их вручную, и это сработало.Так что я не уверен, что я делаю неправильно?

Это потому, что я пытаюсь использовать замену для таблицы?

Также, как мне отладить mysqldb, чтобы он печатал замененный запрос какстрока?

Ответы [ 4 ]

11 голосов
/ 22 февраля 2012

Подстановка параметров в API БД возможна только для значений, а не для таблиц или полей.Вам нужно будет использовать обычную подстановку строк для них:

selectQ ="""SELECT * FROM  %s WHERE %s = %%s;""" % (self.table,self.columnSpecName)
self.db.execute(selectQ,(idKey,))
return self.db.store_result()

Обратите внимание, что значение-заполнитель имеет двойное значение % - это так, что оно остается одним при первоначальной подстановке строки.

1 голос
/ 26 мая 2012

Вот полный рабочий пример

def rtnwkpr(tick, table, col):

    import MySQLdb as mdb
    tickwild = tick + '%'       
    try:
        con = mdb.connect(host, user, password, db);
        cur = con.cursor()
        selectq = "SELECT price FROM %s WHERE %s LIKE %%s;" % (table, col)
        cur.execute(selectq,(tickwild))
        return cur.fetchall()           
0 голосов
/ 22 февраля 2012

Вам нужно будет использовать подстановку строк для добавления имен таблиц и столбцов, драйвер будет обрабатывать только параметры.

Ред .: NM, Даниэль ответил быстрее и более полно

0 голосов
/ 22 февраля 2012

Вы хотели написать:

selectQ = """SELECT * FROM %s WHERE %s = %s;""" % (self.table,self.columnSpecName,idKey) #maybe the idkey should be self.idkey? don't know the rest of the code

self.db.execute(selectQ)

и это просто ошибка с форматированием строки?

Кстати, почему вы пишете явный SQL для такой работы?лучше использовать магические sqlalchemy для манипуляций с питоном sql ..

...