[python] 이상한 SQLAlchemy 오류 메시지 : TypeError : ‘dict’개체가 인덱싱을 지원하지 않습니다

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))


답변

문제 가이 버그 와 관련 있는 것 같습니다 .

이 경우, 해결 방법으로 3 번 이스케이프해야합니다.


답변

이 오류가 표시되면 하나 더 사례를 발견했습니다.

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 패턴과 달리 정규식이 문자열의 시작 또는 끝에 명시 적으로 고정되어 있지 않으면 정규식은 문자열 내 어디에서나 일치 할 수 있습니다.

앵커 $의 경우 문자열 끝 (또는 ^시작)에 어설 션 을 사용할 수 있습니다 .