Включаючи змінну, де пункт arcpy.Select_analysis ()?


21

Я намагаюся провести цикл форм-файлів, вибираючи по черзі кожну функцію і копіюючи її до тимчасового файлу форми, включеного в аналіз об'єднання. Я використовую курсор, щоб знайти ім'я ідентифікатора для кожної функції, яку я встановлюю на змінну "Ім'я". Кожен раз, коли я намагаюся використовувати цю змінну як частину пункту де в arcpy.Select_analysis, я отримую помилку:

ExecuteError: ПОМИЛКА 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 (або, мабуть, пізніше), імена полів не потрібно цитувати" Це неправильно; роздільники поля повинні бути вказані відповідно до основних синтаксичних правил СУБД. Дивіться мою відповідь.
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)

Дивіться також функцію в цій відповіді для багатозначної версії вищевказаної функції.


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. Для чисел вам потрібен 'текст, але не текст.


0

Для мене це рішення працює найкраще, оскільки я можу замінити як змінну на область інтересу, так і ціннісні критерії.

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.