programing

이상한 SQL 화학 오류 메시지:유형 오류: 'dict' 개체가 인덱싱을 지원하지 않습니다.

stoneblock 2023. 5. 14. 10:03

이상한 SQL 화학 오류 메시지:유형 오류: 'dict' 개체가 인덱싱을 지원하지 않습니다.

저는 SqlAlchemy를 사용하여 PG 데이터베이스에서 데이터를 가져오기 위해 수작업 SQL을 사용하고 있습니다.연산자 '%'와 같은 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은 단순히 이전에 데이터베이스에 대해 설정된 연결입니다.

주어야 합니다.%%로 사용하기 위해%왜냐면%python에서 문자열 형식으로 사용되므로 싱글을 쓸 때%이것은 당신이 이것으로 어떤 가치를 대체할 것이라고 가정합니다.

그래서 싱글을 배치하고 싶을 때%쿼리가 포함된 문자열에서 항상 더블을 배치합니다.%.

SQLAlchemy에는 텍스트를 래핑하는 기능이 있어 SQL을 올바르게 이스케이프할 수 있습니다.

예.

res = executeSql(sqlalchemy.text(sql))

당신을 위해 일하고 수동 탈출을 해야 하는 당신을 구해야 합니다.

sqlalchemy 버전 1.2 문서에서 "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 패턴과 달리 정규식은 문자열의 시작 또는 끝에 명시적으로 고정되지 않는 한 문자열 내의 임의의 위치와 일치할 수 있습니다.

앵커의 경우 어설션을 사용할 수 있습니다.$ 문또끝의경우(으)로 표시됨)^우선).

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

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