Отформатируйте строку с несколькими параметрами, чтобы MySQL мог обработать их - PullRequest
1 голос
/ 13 января 2020

Я хочу знать, как я могу отформатировать строку, возвращаемую API, чтобы Mysql мог ее обработать.

Это строка, которую возвращает мой API: bad_string = "History,Romance,Business & Money"

Попытка 1:

cursor.execute("SELECT * FROM book WHERE scrape_category IN (%s) ORDER BY RAND() LIMIT 15", bad_string)

Возвращает это сообщение:

Traceback (most recent call last):
  File "C:\PATH", line 23, in <module>
    cursor.execute("SELECT * FROM book WHERE scrape_category IN (%s) ORDER BY RAND() LIMIT 15", bad_string)
  File "C:\PATH\AppData\Roaming\Python\Python37\site-packages\mysql\connector\cursor_cext.py", line 259, in execute
    "Not all parameters were used in the SQL statement")
mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement

Попытка 2:

bad_string_2 = "'Romance', 'History', 'Business & Money'"

cursor.execute("SELECT * FROM book WHERE scrape_category IN (%s) ORDER BY RAND() LIMIT 15", bad_string_2)

Возвращает это сообщение:

Traceback (most recent call last):
  File "C:PATH", line 21, in <module>
    cursor.execute("SELECT * FROM book WHERE scrape_category IN (%s) ORDER BY RAND() LIMIT 15", bad_string_2)
  File "C:\PATH\AppData\Roaming\Python\Python37\site-packages\mysql\connector\cursor_cext.py", line 246, in execute
    prepared = self._cnx.prepare_for_mysql(params)
  File "C:\PATH\AppData\Roaming\Python\Python37\site-packages\mysql\connector\connection_cext.py", line 520, in prepare_for_mysql
    raise ValueError("Could not process parameters")
ValueError: Could not process parameters

Это работает:

cursor.execute("SELECT * FROM book WHERE scrape_category IN ('Romance', 'History', 'Business & Money') ORDER BY RAND() LIMIT 15")

Запрос работает, когда я делаю это:

cursor.execute("SELECT * FROM book WHERE scrape_category IN ('Romance', 'History', 'Business & Money') ORDER BY RAND() LIMIT 15")

Как мне отформатировать строку и заставить MySQL возвращать результаты?

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Попробуйте что-то вроде этого:

filter ="History,Romance,Business & Money".split(',')
sqlcommand = "SELECT * FROM book WHERE scrape_category IN ({0})".format(
    ', '.join(['%s'] * len(filter)))
print(sqlcommand)
cursor.execute(sqlcommand, filter)
0 голосов
/ 13 января 2020

Ваше строковое значение: "History,Romance,Business & Money"

и вам нужно это: 'Romance', 'History', 'Business & Money'

попробуйте что-то вроде bad_string = " 'Romance', 'History', 'Business & Money' "

Надеюсь, это поможет ...

...