2015-09-29 6 views
1

Так у меня есть следующее сообщение об ошибке:Python, ошибка MySQLdb 1064

_mysql_exceptions.ProgrammingError: (1064, "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 'I, [email protected], D0NBT6)' at line 1") 

Вот мой код:

cnx = MySQLdb.connect(
    user=username, passwd=password, host=hostname, db=databaseName) 
cursor = cnx.cursor() 
cursor.execute("CREATE TABLE if not exists gotchaTable(id int(11) PRIMARY KEY " 
       "AUTO_INCREMENT, selfFirstName TEXT NOT NULL, selfLastName TEXT NOT NULL, " 
       "selfGrade TEXT NOT NULL, selfCode TEXT NOT NULL, targetCode TEXT NOT " 
       "NULL);") 
cnx.commit() 

add_data = (
    "INSERT INTO gotchaTable (selfFirstName, selfLastName, selfGrade, selfCode, targetCode) VALUES ({0}, {1}, {2}, {3}, {4});" 
) 

studentlist = [] 
with open('Gotcha.csv', 'rb') as csvfile: 
    gotchaData = csv.DictReader(csvfile) 
    for row in gotchaData: 
     student = Student(
      row['First'], row['Last'], row['Class'], row['Email']) 
     studentlist.append(student) 
studentlist = randomList(studentlist) 
for x in xrange(1, len(studentlist)): 
    studentlist[x].target = studentlist[ 
     x + 1] if x < len(studentlist) - 1 else studentlist[0] 
    cursor.execute(add_data.format(studentlist[x].first, studentlist[x].last, 
     studentlist[x].grade, studentlist[x].email, 
     studentlist[x].code, studentlist[x].target.code)) 
    cnx.commit() 
    print studentlist[x].getData() 

А вот мой ученик класса:

class Student(object): 

"""docstring for Student""" 

def __init__(self, f, l, c, e): 
    self.first = f 
    self.last = l 
    self.grade = c 
    self.email = e 
    self.code = id_generator() 
    self.target = None 

def getData(self): 
    return self.first + ' ' + self.last + ' ' + self.grade + ' ' + self.email + ' ' + self.code 

Im пытается создать программу, которая получает данные из csv (который уже работает) и помещает его в таблицу SQL. Как исправить ошибку 1064, я пробовал использовать «% s» вместо «{0}», но я получаю ту же ошибку. Какие-либо предложения?

Метод id_generator() возвращает строку случайных символов. randomList (a) делает массив случайным.

ответ

1

Не используйте форматирование строк для параметризации SQL-запроса - это опасно и, как видите, сообщение об ошибке. Вместо этого давайте драйвер MySQL беспокоиться об этом:

add_data = """ 
    INSERT INTO 
     gotchaTable 
     (selfFirstName, selfLastName, selfGrade, selfCode, targetCode) 
    VALUES 
     (%s, %s, %s, %s, %s) 
""" 

Тогда при вызове execute() параметры переходят в отдельный аргумент:

cursor.execute(add_data, [ 
    studentlist[x].first, 
    studentlist[x].last, 
    studentlist[x].grade, 
    # studentlist[x].email, ALSO WATCH THIS ONE (there are only 5 placeholders in the query) 
    studentlist[x].code, 
    studentlist[x].target.code 
]) 
Смежные вопросы