GOOGLE ADS

lunes, 2 de mayo de 2022

¿Cómo escapar del carácter de dos puntos en la cadena de búsqueda?

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

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...