syntax error при выполнении cursor.execute

Код функции:

SEARCH_MOVIES = "SELECT * FROM movies WHERE title LIKE %?%;" 
search_term = input("Enter the partial movie title:") 

def search_movies(search_term):
    with connection:
        cursor = connection.cursor()
        cursor.execute(SEARCH_MOVIES, (f"%{search_term}%",))
        return cursor.fetchall()

Лог ошибки:

File "D:\Programming\Python\Python+PostgreSQL_2.0\movie_watch_list\app.py", line 81, in <module>
    prompt_search_movies()
  File "D:\Programming\Python\Python+PostgreSQL_2.0\movie_watch_list\app.py", line 54, in prompt_search_movies
    movies = database.search_movies(search_term)
  File "D:\Programming\Python\Python+PostgreSQL_2.0\movie_watch_list\database.py", line 67, in search_movies
    cursor.execute(SEARCH_MOVIES, (f"%{search_term}%",))
sqlite3.OperationalError: near "%": syntax error

Ответы (1 шт):

Автор решения: MaxU

У вас ошибка в SQL запросе. SQL движок ожидает такой запрос:

SELECT * FROM movies WHERE title LIKE '%string%'

Обратите внимание на одиночные кавычки! В том случае когда вы используете параметризованные запросы, драйвер БД сам добавит одиночные кавычки для строковых параметров. Т.е. при вызове:

cursor.execute("SELECT * FROM movies WHERE title LIKE %?%;", ("%Star Wars%",))

SQL движок получит такой запрос:

SELECT * FROM movies WHERE title LIKE %'%Star Wars%'%;
# NOTE: ------------------------------^     ------->^

NOTE: Символ процента вне строкового литерала (строка обрамленная одинарными кавычками) - является нарушением SQL синтаксиса.


Поэтому попробуйте так:

SEARCH_MOVIES = "SELECT * FROM movies WHERE title LIKE ?"

с таким SQL запросом ваш код должен работать правильно:

cursor.execute(SEARCH_MOVIES, (f"%{search_term}%",))
→ Ссылка