2015-01-02 4 views
0

Я пытаюсь написать сценарий с использованием pythong и библиотеки mysql-коннекторов. Сценарий должен соединиться с сервером MySQL сделать «SHOW DATABASES LIKE„pdns_%“, а затем, используя результаты, возвращенные запросом использовать каждую базу данных, а затем запустить другой запрос, используя эту базу данных.Python, используя базы данных списка соединителей mysql LIKE, а затем использовать эти базы данных в порядке и выполнить запрос

Вот код

import datetime 
import mysql.connector 
from mysql.connector import errorcode 


cnx = mysql.connector.connect (user='user', password='thepassword', 
           host='mysql.server.com',buffered=True) 
cursor = cnx.cursor() 

query = ("show databases like 'pdns_%'") 

cursor.execute(query) 

databases = query 

for (databases) in cursor: 
    cursor.execute("USE %s",(databases[0],)) 
    hitcounts = ("SELECT Monthname(hitdatetime) AS 'Month', Count(hitdatetime) AS 'Hits' WHERE hitdatetime >= Date_add(Last_day(Date_sub(Curdate(), interval 4 month)), interval 1 day) AND hitdatetime < Date_add(Last_day(Date_sub(Curdate(), interval 1 month)), interval 1 day) GROUP BY Monthname(hitdatetime) ORDER BY Month(hitdatetime)") 
    cursor.execute(hitcounts) 
    print(hitcounts) 


cursor.close() 
cnx.close() 

при выполнении сценария он останавливается со следующим error'd выходом

Traceback (most recent call last): 
    File "./mysql-test.py", line 18, in <module> 
    cursor.execute("USE %s",(databases[0],)) 
    File "/usr/lib/python2.6/site-packages/mysql/connector/cursor.py", line 491, in execute 
    self._handle_result(self._connection.cmd_query(stmt)) 
    File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 635, in cmd_query 
    statement)) 
    File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 553, in _handle_result 
    raise errors.get_exception(packet) 
mysql.connector.errors.ProgrammingError: 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 ''pdns_382'' at line 1 

Основываясь на ошибки, я угадывание есть проблема с тем, как его делать имя datbase из первого запроса. Любой указатели в правильном направлении были бы очень hel как я очень начинающий. Большое спасибо.

ответ

1

Увы, две арг форма execute делает не поддержки «мета» параметры, такие как имена баз данных, таблиц или полей (примерно, думаю идентификаторов вы бы не цитатой если писать запрос вручную). Таким образом, отказавшее заявление:

cursor.execute("USE %s",(databases[0],)) 

потребность быть повторно закодировано как:

cursor.execute("USE %s" % (databases[0],)) 

т.е., в одной форме агда из execute с интерполяцией строк. К счастью, в этом конкретном случае не подвергает вас риску инъекций SQL, поскольку вы только интерполируете имена БД, поступающие прямо от механизма БД.