Tengo la siguiente consulta, que funciona perfectamente siempre que no haya dos puntos :
en la consulta de búsqueda.
search_query = "http:"
with Session() as session:
search_query_stmt = text(
"""
SELECT count(rowid) as count
FROM post_fts
WHERE post_fts=:search_string
"""
)
count = session.execute(
search_query_stmt, {"search_string": search_query}
).scalar_one()
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: http
[SQL:
SELECT count(rowid) as count
FROM post_fts
WHERE post_fts=?
]
[parameters: ('http:',)]
He intentado lo siguiente según la documentación de SQLAlchemy
search_query = "http:"
search_query = search_query.replace(':', r'\:')
Lo que da el siguiente error.
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) fts5: syntax error near "\"
[SQL:
SELECT count(rowid) as count
FROM post_fts
WHERE post_fts match?;
]
[parameters: ('http\\:',)]
Solución del problema
Obtuve una solución después de recibir un error para otro carácter (guión -
). El problema era que no estaba consultando ninguna tabla o vista normal. Estaba consultando un índice SQLite FTS5.
Buscar si alguien enfrentó un error similar usando el índice FTS5, me llevó a esta pregunta.
No puede simplemente usar cualquier cadena aleatoria con FTS
Lea los documentos de SQLite FTS5 nuevamente y encontró esto:
Dentro de una expresión FTS, una cadena se puede especificar de dos maneras:
Incluyéndolo entre comillas dobles ("). Dentro de una cadena, cualquier carácter de comilla doble incrustado se puede escapar al estilo SQL, agregando un segundo carácter de comilla doble.
...
Mi solución de trabajo actual es esta:
search_query = '"' + search_query.replace('"', '""') + '"'
No hay comentarios:
Publicar un comentario