Olá... estou tentando adicionar um parâmetro à minha consulta, mas recebo este erro:
"errorMessage": "{'S': 'ERROR', 'V': 'ERROR', 'C': '42601', 'M': 'syntax error at or near \”$2\"', 'P': '3793', 'F': 'scan.l', 'L': '1146', 'R': 'scanner_yyerror'}"
Isso funciona:
import pg8000
account_id = 1234
sql = “”"
SELECT *
FROM samples
WHERE account_id = %s
AND delete_date IS NULL
ORDER BY date DESC
“”"
cursor.execute(sql, (account_id,))
Mas isso não:
import pg8000
account_id = 1234
start_date = query_string_params['start-date'] if 'start-date' in query_string_params else None
// start_date format is: '2025-02-04'
filters = “"
if start_date is not None:
filters = filters + f" AND DATE(sample_date) >= '{start_date}'"
sql = “”"
SELECT *
FROM samples
WHERE account_id = %s
AND delete_date IS NULL
%s
ORDER BY date DESC
“”"
cursor.execute(sql, (account_id, filters))
Alguém tem ideia do que estou fazendo errado?
Os parâmetros SQL devem ser valores, não código SQL em si. Os filtros fazem parte de uma consulta dinâmica, não um valor de parâmetro.
Isso funciona, mas provavelmente adiciona o risco de um ataque de injeção de SQL, já que
start_date
a entrada não será escapada pelo driver pg.Seria mais seguro converter
start_date
para o mesmo formatosample_date
e escrever o filtro comofilters = filters + f" AND DATE(sample_date) >= %s"
também poderia funcionar, masDATE(sample_date)
poderia introduzir uma penalidade de desempenho dependendo da contagem de registros inspecionados.