이상한 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
'programing' 카테고리의 다른 글
병합 충돌을 해결한 후 병합을 완료하려면 어떻게 해야 합니까? (0) | 2023.05.14 |
---|---|
__file__이(가) 주피터 노트북에 없습니다. (0) | 2023.05.14 |
Git 확장자:Win32 오류 487: Cygwin 힙에 대한 공간을 예약할 수 없습니다. Win32 오류 0 (0) | 2023.05.14 |
파일 찾아보기 대화 상자를 VB에 추가하는 방법.NET 응용 프로그램 (0) | 2023.05.14 |
GC는 언제 사용해야 합니까?Finalize()를 억제하시겠습니까? (0) | 2023.05.09 |