이상한 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).
'program story' 카테고리의 다른 글
새로운 대기열에 자동으로 기존 값을 대기열에 넣는 고정 크기 대기열 (0) | 2020.07.28 |
---|---|
Javascript에서 일부 비동기 작업이 완료되기를 기다리는 가장 간단한 방법은 무엇입니까? (0) | 2020.07.28 |
Java 문자열 풀이 란 무엇이며 "s"는 새로운 문자열과 어떻게 다른가요? (0) | 2020.07.28 |
힘내 : 가져 오기 전용 리모컨을 설정 하시겠습니까? (0) | 2020.07.27 |
matplotlib의 세로 및 가로 선 (0) | 2020.07.27 |