Как запросить строки, содержащие апострофы или любые другие не алфавитно-цифровые символы
Я пытаюсь выполнить некоторые запросы к базе данных с SQLAlchemy
, Но у меня есть проблема, запрашивающая строки, которые имеют апострофы или любые не алфавитно-цифровые символы.
Например: test = "Я \"
Я использовал:
matchList = session.query(Quote).filter(Quote.quote.contains(test)).all()
В базе данных есть 1 запись, которая содержит "I've"
в качестве подстроки. Но matchList оказывается пустым списком. Что я делаю неправильно?
Полный код:
sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy_declarative import Base, Quote
from sqlalchemy_utils import escape_like
engine = create_engine("sqlite:///quotes.db")
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
test = "I\'ve"
qList = session.query(Quote).filter(Quote.quote.contains(test.replace('\'', ''))).all()
print qList
Это похоже на SQLAlchemy
не обрабатывает escape-последовательность Может ли кто-нибудь помочь
2 ответа
Строковый литерал Python
"I\'ve"
Оценивает строку
"I've"
Однако вам, скорее всего, понадобится фактическая обратная косая черта во входных данных базы данных, поэтому попробуйте экранировать обратную косую черту вместо одинарных кавычек:
"I\\'ve"
Все это говорит о том, что, возможно, есть лучший способ избежать запросов в SQLAlchemy, о которых я не знаю. Что-то вроде db.find(Quote.quote == "I've")
где он убегает для вас.
У меня была такая же проблема, но экранирование не помогло, потому что я не понимал, что в базе данных хранится не тот апостроф, как я думал, а умный апостроф. По какой-то причине Genius API возвращал умные апострофы, и это то, что я добавлял в базу данных.
# In the database (smart apostrophe returned by Genius):
"Cat’s in the Cradle"
# What I was searching for (regular apostrophe)
"Cat's in the Cradle"
Я думаю, что одним из возможных решений является замена умного апострофа на обычный во время поиска.