Estou usando o SQL artesanal para buscar dados de um banco de dados PG, usando SqlAlchemy. Estou tentando uma consulta que contém o SQL como operador '%' e que parece lançar SqlAlcjhemy através de um loop:
sql = """
SELECT DISTINCT u.name from user u
INNER JOIN city c ON u.city_id = c.id
WHERE c.designation=upper('fantasy')
AND c.id IN (select id from ref_geog where short_name LIKE '%opt')
"""
# The last line in the above statement throws the error mentioned in the title.
# However if the last line is change to:
# AND c.id IN (select id from ref_geog where short_name = 'helloopt')
# the script runs correctly.
#
# I also tried double escaping the '%' i.e. using '%%' instead - that generated the same error as previously.
connectDb()
res = executeSql(sql)
print res
closeDbConnection()
Alguém sabe o que está causando essa mensagem de erro enganosa e como posso corrigi-la?
[[Editar]]
Antes que alguém pergunte, não há nada de especial ou sofisticado nas funções incluídas acima. Por exemplo, a função executeSql () chama simplesmente conn.execute (sql) e retorna os resultados. A variável conn é simplesmente a conexão estabelecida anteriormente com o banco de dados.
python
postgresql
sqlalchemy
Homunculus Reticulli
fonte
fonte
executeSql(...)
? E também, você realmente temRETURNING *
naSELECT
declaração?Respostas:
Você tem que dar
%%
para usá-lo como%
porque%
em python é usado como formatação de string, então quando você escreve single,%
assume que você irá substituir algum valor por isso.Então, quando você quiser colocar uma única
%
string com a consulta sempre, coloque double%
.fonte
SQLAlchemy tem uma
text()
função para agrupar texto que parece escapar corretamente do SQL para você.Ou seja,
deve funcionar para você e evitar que você faça o escape manual.
fonte
Não consigo encontrar o "executeSql" nos documentos sqlalchemy versão 1.2 , mas a linha abaixo funcionou para mim
fonte
Parece que seu problema pode estar relacionado a esse bug .
Nesse caso, você deve escapar três vezes como solução alternativa.
fonte
Encontrei mais um caso quando esse erro aparece:
Em outras palavras, se você fornecer o parâmetro (
%s
) na consulta, mas esquecer de adicionar parâmetros de consulta. Nesse caso, a mensagem de erro é muito enganadora.fonte
Mais uma
%
observação - você também deve escapar (ou excluir) os caracteres nos comentários. Infelizmente,sqlalchemy.text(query_string)
não escapa dos sinais de porcentagem nos comentários.fonte
Outra maneira de resolver seu problema, se você não quiser escapar de
%
caracteres ou usarsqlalchemy.text()
, é usar uma expressão regular.Ao invés de:
Tente (para correspondência que diferencia maiúsculas de minúsculas):
ou (para não diferenciar maiúsculas de minúsculas):
Ambos
LIKE
e regex são abordados na documentação sobre correspondência de padrões .Observe que:
Para uma âncora, você pode usar a asserção
$
para final de sequência (ou^
para início).fonte
Isso também pode resultar do caso - caso os parâmetros a serem passados para o SQL sejam declarados no formato DICT e estejam sendo manipulados no SQL na forma de LIST ou TUPPLE.
fonte