arcpy.Select_analysis ()의 where 절에 변수를 포함 하시겠습니까?


21

셰이프 파일을 반복하여 각 피처를 차례로 선택하고 통합 분석에 포함시켜 임시 셰이프 파일에 복사하려고합니다. 커서를 사용하여 변수 '이름'으로 설정하는 각 기능의 ID 이름을 찾습니다. arcpy.Select_analysis에서 where 절의 일부로이 변수를 사용하려고 할 때마다 오류가 발생합니다.

ExecuteError : ERROR 999999 : 기능 실행 중 오류가 발생했습니다. 유효하지 않은 SQL 문이 사용되었습니다. 유효하지 않은 SQL 문이 사용되었습니다. 실행하지 못했습니다 (선택).

내가 사용하는 코드는 다음과 같습니다

Name = 101
where = "\'\"StudyID\" = \\'"+str(Name)+"\\'\'"
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

변수를 사용하지 않고 입력하면 :

arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", '"StudyID" = \'101\'')

잘 작동합니다

변수를 SQL 문에 맞추려면 어떻게해야합니까?

답변:


14

또 다른, 아마도 더 간단한 방법은 다음과 같습니다.

where = '"StudyID" = ' + "'%s'" %Name

2
"ArcGIS 10 (또는 아마도 나중에)을 사용할 때 필드 이름을 인용 할 필요는 없습니다"이것은 잘못된 것입니다. 필드 구분자는 기본 DBMS의 구문 규칙에 따라 지정해야합니다. 내 대답을 참조하십시오.
blah238

위의 의견은이 답변의 정확성을 위해 롤백 한 익명 편집에 대한 답변입니다.
blah238

Name사용자 입력으로 인한 SQL 인젝션 취약점이 아닙니까?
jpmc26

22

WHERE 절을 훨씬 쉽게 작성하는 한 가지 AddFieldDelimiters기능은 FGDB의 큰 따옴표 및 PGDB의 괄호와 같이 필드 식별자에 대한 올바른 DBMS 특정 구분 기호를 자동으로 추가 하는 함수 를 사용하는 것입니다.

고려해야 할 또 다른 사항은 값이 숫자, 문자열 또는 기타 데이터 유형인지 여부입니다. 특히 문자열은 작은 따옴표로 묶지 만 숫자는 그렇지 않습니다. 필드 유형을 확인하고 문자열 필드 인 경우 작은 따옴표를 추가 할 수 있습니다.

예 :

import arcpy

def buildWhereClause(table, field, value):
    """Constructs a SQL WHERE clause to select rows having the specified value
    within a given field and table."""

    # Add DBMS-specific field delimiters
    fieldDelimited = arcpy.AddFieldDelimiters(table, field)

    # Determine field type
    fieldType = arcpy.ListFields(table, field)[0].type

    # Add single-quotes for string field values
    if str(fieldType) == 'String':
        value = "'%s'" % value

    # Format WHERE clause
    whereClause = "%s = %s" % (fieldDelimited, value)
    return whereClause

if __name__ == "__main__":
    inputfc = r"C:\input.shp"
    outputfc = r"C:\output.shp"
    fieldname = "StudyID"
    fieldvalue = 101
    whereclause = buildWhereClause(inputfc, fieldname, fieldvalue)
    arcpy.Select_analysis(inputfc, outputfc, whereclause)

위 함수의 다중 값 버전에 대해서는 이 답변 의 함수를 참조하십시오 .


2
좋은 생각이야 이 arcpy.buildWhereClause으로 정의된다, 그래서 나는 모듈 내 arcpy 도우미 기능으로이 기능을 추가
blord - 카스티요

3

이 시도:

Name = 1
study = "StudyID"

where = '"' + study + '" = ' + "'" + str(Name) + "'"

0

삼중 따옴표를 사용하고 싶습니다. 나는 그들이 읽는 것이 가장 쉽다고 생각합니다. 예를 들어

name = 101
where = """ "StudyID" = '%s' """ % name
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

type(name)당신 에 따라 '주위 가 필요할 수도 있고 필요하지 않을 수도 있습니다 %s. 숫자의 경우 '텍스트 가 필요 하지만 문자 는 필요 하지 않습니다.


0

나를 위해이 솔루션은 변수를 관심 분야와 값 기준으로 대체 할 수 있으므로 가장 효과적입니다.

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.