program story

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

inputbox 2020. 7. 28. 08:29
반응형

이상한 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))

당신을 위해 일하고 수동 탈출을하지 않아도됩니다.


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

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


sqlalchemy 버전 1.2 docs 에서 "executeSql"을 찾을 수 없지만 아래 줄이 나를 위해 일했습니다.

engine.execute(sqlalchemy.text(sql_query))

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

c.execute("SELECT * FROM t WHERE a = %s")

즉, %s쿼리에 매개 변수 ( ) 를 제공 하지만 쿼리 매개 변수를 추가하는 것을 잊어 버린 경우. 이 경우 오류 메시지가 매우 잘못되었습니다.


한 번 더 메모- %주석에서 문자를 이스케이프 (또는 삭제)해야합니다 . 불행히도, sqlalchemy.text(query_string)주석에서 백분율 기호를 피하십시오.


이는 SQL로 전달 될 매개 변수가 DICT 형식으로 선언되어 LIST 또는 TUPPLE 형식으로 SQL에서 조작되는 경우에도 발생할 수 있습니다.


%문자 를 이스케이프 하거나 사용 하지 않으려는 경우 문제를 해결하는 또 다른 방법은 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 에 대한 문서 에서 정규식과 정규식이 모두 다루어 집니다 .

참고 :

Unlike LIKE patterns, a regular expression is allowed to match anywhere within a string, unless the regular expression is explicitly anchored to the beginning or end of the string.

For an anchor, you can use the assertion $ for end of string (or ^ for beginning).

참고URL : https://stackoverflow.com/questions/8657508/strange-sqlalchemy-error-message-typeerror-dict-object-does-not-support-inde

반응형