2015-07-31 2 views
-1

У меня возникли проблемы с выполнением этого запроса в python. У меня есть база данных IP, которая имеет три столбца startip, endip и страну. Теперь я хочу расположить ip. это мой кодmysql показывает ошибку в синтаксисе

def get_country(ip): 

    try: 
      conn = MySQLConnection(host='localhost', database='ipdb', user ='root', password='password') 
      cursor = conn.cursor() 
      query = 'SELECT * FROM db6 WHERE %s BETWEEN INET_ATON(startip) AND INET_ATON(endip)' 
      ip_inint= ip2int(ip) 
      cursor.execute(query,ip_inint) 
      row = cursor.fetchone() 
      while row is not None: 
        print " Start range %s end range %s country %s " %(row[0], row[1], row[2]) 
        row = cursor.fetchone() 
    except Error as error: 
      print(error) 

функция ip2int является

def ip2int(addr): 
    return struct.unpack("!I", socket.inet_aton(addr))[0] 

ошибки я получаю это

1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s BETWEEN INET_ATON(startip) AND INET_ATON(endip)' at line 1 

что может быть проблема?

+1

Что такое% s с отступом? – apomene

+0

Что означает% s здесь? в этом месте вам нужно имя столбца или подобное? – Olli

+0

Вам также нужны обратные метки (') вокруг имени вашей таблицы – heinst

ответ

1

Вы должны передать кортеж к execute():

cursor.execute(query, (ip_inint,)) 

Список вероятно, будет работать тоже:

cursor.execute(query, [ip_inint]) 

Альтернативой является использование словаря с именованными переменными в запросе:

query = 'SELECT * FROM db6 WHERE %(ip_inint)s BETWEEN INET_ATON(startip) AND INET_ATON(endip)' 
cursor.execute(query, {'ip_inint': ip_inint}) 

Справка: http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

+0

Я пробовал ваше решение, но оно показывает «Не все параметры были использованы в выражении SQL», когда я использовал cursor.execute (query, (ip_inint)) или cursor.execute (query, [ip_inint]). Последнее решение сработало. благодаря –

Смежные вопросы