SqlAlchemy를 사용하여 손으로 만들어진 SQL을 사용하여 PG 데이터베이스에서 데이터를 가져옵니다. 연산자 ‘%’와 같은 SQL이 포함 된 쿼리를 시도 중이며 루프를 통해 SqlAlcjhemy를 던지는 것 같습니다.
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()
이 잘못된 오류 메시지의 원인과 해결 방법을 아는 사람이 있습니까?
[[편집하다]]
누군가가 묻기 전에, 위에 포함 된 기능들에 대해 특별하거나 공상적인 것은 없습니다. 예를 들어, executeSql () 함수는 단순히 conn.execute (sql)를 호출하고 결과를 리턴합니다. conn 변수는 단순히 이전에 설정된 데이터베이스 연결입니다.
답변
당신은 줄 필요 %%
로 사용 %
하기 때문에 %
파이썬 당신이 하나 쓸 때 너무 서식 문자열로 사용하는 것입니다 %
그것의이 일부 값을 대체하려고하는 가정이.
따라서 %
쿼리를 통해 문자열에 단일을 배치하려면 항상 double을 배치하십시오 %
.
답변
SQLAlchemy에는 text()
SQL을 올바르게 이스케이프 처리하는 것으로 보이는 텍스트 줄 바꿈 기능이 있습니다.
즉
res = executeSql(sqlalchemy.text(sql))
당신을 위해 일하고 수동 탈출을하지 않아도됩니다.
답변
sqlalchemy 버전 1.2 docs 에서 “executeSql”을 찾을 수 없지만 아래 줄이 나를 위해 일했습니다.
engine.execute(sqlalchemy.text(sql_query))
답변
답변
이 오류가 표시되면 하나 더 사례를 발견했습니다.
c.execute("SELECT * FROM t WHERE a = %s")
즉, %s
쿼리에 매개 변수 ( ) 를 제공 하지만 쿼리 매개 변수를 추가하는 것을 잊어 버린 경우. 이 경우 오류 메시지가 매우 잘못되었습니다.
답변
한 번 더 메모- %
주석에서 문자를 이스케이프하거나 삭제해야합니다 . 불행히도, sqlalchemy.text(query_string)
주석에서 백분율 기호를 피하십시오.
답변
%
문자 를 이스케이프 하거나 사용 하지 않으려는 경우 문제를 해결하는 또 다른 방법은 sqlalchemy.text()
정규식을 사용하는 것입니다.
대신에:
select id from ref_geog where short_name LIKE '%opt'
시도 (대소 문자 구분)
select id from ref_geog where short_name ~ 'opt$'
또는 (대소 문자를 구분하지 않음) :
select id from ref_geog where short_name ~* 'opt$'
패턴 일치LIKE
에 대한 문서 에서 정규식과 정규식이 모두 다루어 집니다 .
참고 :
LIKE 패턴과 달리 정규식이 문자열의 시작 또는 끝에 명시 적으로 고정되어 있지 않으면 정규식은 문자열 내 어디에서나 일치 할 수 있습니다.
앵커 $
의 경우 문자열 끝 (또는 ^
시작)에 어설 션 을 사용할 수 있습니다 .