Python - автоматизация MySQL-запроса: передача параметра - PullRequest
2 голосов
/ 08 января 2010

Код в последовательности работает нормально, но стремится улучшить код MySQL до более эффективного формата.

Первый случай касается функции, которая получила параметр и возвращает customerID из MySQL db:

def clean_table(self,customerName):
    getCustomerIDMySQL="""SELECT customerID
    FROM customer
    WHERE customerName = %s;"""

    self.cursorMySQL.execute(getCustomerIDMySQL,(customerName))
    for getID_row in self.cursorMySQL:
        customerID=getID_row[0]

    return customerID

В том случае, если мы знаем заранее, что результатом будет всего один вывод, как вставить то же самое в мой getID_row, без использования оператора "for"?

Во втором случае функция выполняется с именем таблицы ('customer') ...

def clean_tableCustomer(self):
    cleanTableQuery = """TRUNCATE TABLE customer;"""
    self.cursorMySQL.execute(cleanTableQuery)

    setIndexQuery = """ALTER TABLE customer AUTO_INCREMENT = 1;"""
    self.cursorMySQL.execute(setIndexQuery)

тогда как заменить имя таблицы в качестве параметра, передаваемого через функцию? Вот как я пытался это сделать:

def clean_table(self,tableName):
    cleanTableQuery = """TRUNCATE TABLE %s;"""
    self.cursorMySQL.execute(cleanTableQuery,(tableName))

    setIndexQuery = """ALTER TABLE %s AUTO_INCREMENT = 1;"""
    self.cursorMySQL.execute(setIndexQuery,(tableName))

Но на этот раз MySQL не работал.

Все комментарии и предложения высоко ценятся.

Ответы [ 2 ]

3 голосов
/ 08 января 2010

Для первого случая (просто, но легко получить KeyError, когда нет строки):

customerID = self.cursorMySQL.fetchone()[0]

Более правильным является реализация нового метода для класса курсора:

def autofetch_value(self, sql, args=None):
    """ return a single value from a single row or None if there is no row
    """
    self.execute(sql, args)
    returned_val = None

    row = self.fetchone()
    if row is not None:
        returned_val = row[0]

    return returned_val

Для второго случая:

def clean_table(self,tableName):
    cleanTableQuery = """TRUNCATE TABLE %s;""" % (tableName,)
    self.cursorMySQL.execute(cleanTableQuery)

    setIndexQuery = """ALTER TABLE %s AUTO_INCREMENT = 1;""" % (tableName,)
    self.cursorMySQL.execute(setIndexQuery)

Убедитесь, что вы дезинфицируете данные, так как курсор не будет.

0 голосов
/ 08 января 2010

К сожалению, вы не можете параметризовать имя таблицы (см. этот пост ). Вам придется использовать строковые операции Python, чтобы делать то, что вы пытаетесь здесь.

Надеюсь, это поможет, мне потребовалось некоторое время, чтобы узнать, когда я столкнулся с этой проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...