Bao gồm biến trong mệnh đề của arcpy.Select_analysis ()?


21

Tôi đang cố gắng lặp qua một shapefile, lần lượt chọn từng tính năng và sao chép nó vào một shapefile tạm thời để đưa vào phân tích kết hợp. Tôi đang sử dụng một con trỏ để tìm tên ID cho từng tính năng mà tôi đang đặt thành một biến 'Tên'. Bất cứ khi nào tôi cố gắng sử dụng biến này như một phần của mệnh đề where trong arcpy.Select_analysis, tôi gặp lỗi:

ExecuteError: ERROR 999999: Lỗi thực thi chức năng. Một câu lệnh SQL không hợp lệ đã được sử dụng. Một câu lệnh SQL không hợp lệ đã được sử dụng. Không thể thực thi (Chọn).

Mã tôi đang sử dụng là:

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

Nếu tôi gõ nó ra mà không sử dụng các biến:

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

nó hoạt động tốt

Tôi cần làm gì để phù hợp với biến vào câu lệnh sql?

Câu trả lời:


14

Một cách khác, có thể đơn giản hơn, là:

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

2
"Khi sử dụng ArcGIS 10 (hoặc, có lẽ là sau này), tên trường không cần được trích dẫn" Điều này không chính xác; các dấu phân cách trường phải được chỉ định theo các quy tắc cú pháp của DBMS cơ bản. Xem câu trả lời của tôi.
blah238

Nhận xét trên là để đáp lại một chỉnh sửa ẩn danh mà tôi đã quay lại vì tính chính xác của câu trả lời này.
blah238

Đây không phải là một lỗ hổng SQL tiêm nếu Nameđến từ đầu vào của người dùng?
jpmc26

22

Một điều làm cho việc viết WHERE mệnh đề dễ dàng hơn nhiều là sử dụng AddFieldDelimitershàm, nó tự động thêm các dấu phân cách cụ thể, cụ thể DBMS cho các định danh trường, chẳng hạn như dấu ngoặc kép cho FGDB và dấu ngoặc cho PGDB.

Một điều khác bạn phải xem xét là liệu giá trị là một số, chuỗi hoặc loại dữ liệu khác. Cụ thể, các chuỗi được gói trong dấu ngoặc đơn trong khi số thì không. Bạn có thể kiểm tra loại trường và thêm dấu ngoặc đơn nếu đó là trường chuỗi.

Ví dụ:

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)

Xem thêm hàm trong câu trả lời này để biết phiên bản đa giá trị của hàm trên.


2
Ý tưởng tuyệt vời. Tôi đã thêm chức năng này vào mô đun chức năng của trình trợ giúp Arcpy của mình để nó được định nghĩa là arcpy.buildWhereClause
blord-castillo

3

Thử đi:

Name = 1
study = "StudyID"

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

0

Tôi thích sử dụng ba dấu ngoặc kép. Tôi nghĩ rằng chúng là dễ đọc nhất. Ví dụ,

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

Tùy thuộc vào type(name)bạn có thể hoặc không cần 'xung quanh %s. Đối với số, bạn không cần 'nhưng không cho văn bản.


0

Đối với tôi, giải pháp này hoạt động tốt nhất vì tôi có thể thay thế cả một biến cho lĩnh vực quan tâm và tiêu chí giá trị.

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.