Запасной знак апострофа в SQL-запросе в SQLAlchemy - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь найти книгу в базе данных, поэтому сначала проверяю, существуют ли в БД данные, сообщенные пользователем (это может быть заголовок, ISBN или имя автора), затем проверяю, существует ли часть данных, и , наконец, я возвращаю все результаты.

Для этого я написал этот код на Python, используя SQLAlchemy и FLASK, где

  • searchBy - это имя столбца в БД, а
  • searchFor - данные, введенные пользователем

.

books = db.execute(f"SELECT * FROM books JOIN authors ON books.author_id = authors.id \
                   WHERE ({searchBy} = :searchFor) OR ({searchBy} LIKE :searchFor%)", 
                   {"searchFor": searchFor}).fetchall()

Однако, когда :searchFor заменяется его соответствующим значением, оно вычисляется между апостропами.

 ...(title = 'Animal Farm') OR (title LIKE 'Animal Farm'%)

вызывает эту ошибку

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near ")"
LINE 1: ...              WHERE (title = 'Love') OR (title LIKE 'Love'%)
                                                                      ^

Может кто-нибудь помочь мне понять, почему это происходит и как правильно это сделать?

1 Ответ

0 голосов
/ 10 мая 2018

Причина в том, что она передает переменную в виде строки (как и должно быть в этом случае). Зная это, вы захотите объединить символ% со строкой поиска. Примерно так должно работать:

books = db.execute(f"SELECT * FROM books JOIN authors ON books.author_id = authors.id \
                   WHERE ({searchBy} = :searchFor) OR ({searchBy} LIKE (:searchFor || '%'))", 
                   {"searchFor": searchFor}).fetchall()
...