Включая переменную в предложении где arcpy.Select_analysis ()?

21

Я пытаюсь перебрать шейп-файл, поочередно выбирая каждый объект и копируя его во временный шейп-файл, чтобы включить в анализ объединения. Я использую курсор, чтобы найти имя идентификатора для каждой функции, для которой я устанавливаю переменную «Имя». Всякий раз, когда я пытаюсь использовать эту переменную как часть предложения where в arcpy.Select_analysis, я получаю сообщение об ошибке:

Ошибка выполнения: ОШИБКА 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
Marcin
источник
2
«При использовании ArcGIS 10 (или, предположительно, позже) имена полей не должны заключаться в кавычки» Это неверно; разделители полей должны быть указаны в соответствии с правилами синтаксиса СУБД. Смотри мой ответ.
blah238
Вышеупомянутый комментарий был в ответ на анонимное редактирование, которое я откатил для правильности этого ответа.
blah238
Разве это не уязвимость SQL-инъекций, если она Nameпоступает от пользователя?
jpmc26
22

Одна вещь, которая значительно упрощает написание предложений WHERE, - это использование AddFieldDelimitersфункции, которая автоматически добавляет правильные специфичные для СУБД разделители для идентификаторов полей, такие как двойные кавычки для FGDB и скобки для PGDB.

Другая вещь, которую вы должны рассмотреть, это то, является ли значение числом, строкой или другим типом данных. В частности, строки заключаются в одинарные кавычки, а числа - нет. Вы можете проверить тип поля и добавить одинарные кавычки, если это строковое поле.

Например:

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)

См. Также функцию в этом ответе для многозначной версии вышеуказанной функции.

blah238
источник
2
Отличная идея. Я добавил эту функцию в свой модуль вспомогательных функций arcpy, чтобы она определялась как arcpy.buildWhereClause
blord-castillo
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. Для чисел вам нужно, 'но не для текста.

gisdude
источник
0

Для меня это решение работает лучше всего, так как я могу заменить как переменную на интересующую область, так и на критерии оценки.

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
dwiz
источник