1064, «У вас есть ошибка в вашем синтаксисе SQL» вставка (Другое) - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть следующая ошибка в моей IDE:

MySQLdb._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 '2102@lionstate.edu', '88zlsj5j', 'Kristopher O'Connell', '21', 'F', 'CMPSC', '77' at line 1")

Вот часть моего кода, которая вызывает ошибку:

for a, b, c, d, e ,f, g, h in zip(df_stu['Email'], df_stu['Password'], df_stu['Full Name'], df_stu['Age'], df_stu['Gender'], df_stu['Major'], df_stu['Street'], df_stu['Zip']):
    cursor.execute("INSERT INTO LSU.Student (Semail, Spassword, Sname, Sage, Sgender, Smajor, Sstreet, Szipcode) "
                   "VALUES ('%s', '%s', '%s', '%d', '%s', '%s', '%s', '%d')" % (a, b, c, d, e, f, g, h))

И это мой CREATE TABLE:

cursor.execute("CREATE TABLE IF NOT EXISTS LSU.Student (Semail CHAR(50), Spassword CHAR(20), Sname CHAR(50), "
               "Sage INT, Sgender CHAR(5), Smajor CHAR(50), Sstreet CHAR(50), Szipcode INT, PRIMARY KEY (Semail))")

Мне это кажется правильным, но в среде IDE постоянно говорят о синтаксической ошибке.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Рассмотрим параметризацию , рекомендуемый и рекомендуемый наилучший в отрасли подход для предотвращения внедрения SQL-кода злоумышленниками; заключать в кавычки и специальные символы, которые могут помешать выполнению запроса; и нечитаемый / не поддерживаемый код, когда данные смешиваются с кодом.

# PREPARED STATEMENT (ALL PLACEHOLDERS USING UNQUOTED %s PLACEHOLDERS, NO DATA)
sql = """INSERT INTO LSU.Student (Semail, Spassword, Sname, Sage, Sgender, Smajor, Sstreet, Szipcode)
         VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
      """

for a, b, c, d, e ,f, g, h in zip(df_stu['Email'], df_stu['Password'], df_stu['Full Name'], 
                                  df_stu['Age'], df_stu['Gender'], df_stu['Major'], 
                                  df_stu['Street'], df_stu['Zip']):    
    # QUERY EXECUTION
    cursor.execute(sql, (a, b, c, d, e, f, g, h))

Даже рассмотрим executemany, используя метод pandas DataFrame.values ​​, поскольку кажется, что вы выполняете итерацию из фрейма данных. Это позволяет избежать циклов for и zip:

# PREPARED STATEMENT
sql = """INSERT INTO LSU.Student (Semail, Spassword, Sname, Sage, Sgender, Smajor, Sstreet, Szipcode)
         VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
      """

# EXECUTE PARAMETERIZED QUERY
sql_cols = ['Email', 'Password', 'Full Name', 'Age', 'Gender', 'Major', 'Street', 'Zip']
cursor.executemany(sql, df_stu[sql_cols].values.tolist())   
conn.commit()
0 голосов
/ 03 апреля 2019

Может ли одинарная кавычка (') в' Kristopher O'Connell 'вмешиваться в запрос?

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