Arcpy.Select_analysis () yan tümcesinde değişken de dahil olmak üzere?


21

Her bir özelliği sırayla seçip, bir şekil analizine dahil ederek geçici bir şekil dosyasına kopyalamaya, bir şekil dosyası arasında döngü oluşturmaya çalışıyorum. Değişken bir 'Ad' olarak ayarladığım her özelliğin kimlik adını bulmak için bir imleç kullanıyorum. Bu değişkeni arcpy.Select_analysis içindeki where yan tümcesinin bir parçası olarak kullanmaya çalıştığımda bir hata alıyorum:

ExecuteError: ERROR 999999: İşlev yürütme hatası. Geçersiz bir SQL ifadesi kullanıldı. Geçersiz bir SQL ifadesi kullanıldı. Yürütülemedi (Seç).

Kullandığım kod:

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

Değişkenleri kullanmadan yazarım:

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

iyi çalışıyor

Değişkeni sql deyimine sığdırmak için ne yapmam gerekir?

Yanıtlar:


14

Bir başka, belki daha basit, yol şudur:

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

2
"ArcGIS 10 kullanılırken (veya daha sonra muhtemelen), alan adlarının alıntılanması gerekmez" Bu yanlış; alan sınırlayıcıları, temel DBMS'nin sözdizimi kurallarına göre belirtilmelidir. Cevabımı gör.
blah238

Yukarıdaki yorum, bu cevabın doğruluğu için geri aldığım isimsiz bir düzenlemeye yanıt olarak geldi.
blah238

Bu Namekullanıcı girişinden kaynaklanıyorsa bu bir SQL ekleme güvenlik açığı değil mi?
jpmc26

22

WHERE cümlelerini yazmayı çok kolaylaştıran şeylerden biri AddFieldDelimiters, FGDB için çift tırnak işaretleri ve PGDB için parantezler gibi alan tanımlayıcıları için doğru, DBMS'ye özgü sınırlayıcıları otomatik olarak ekleyen işlevi kullanmaktır .

Dikkate almanız gereken diğer şey, değerin bir sayı, dize veya başka bir veri türü olup olmadığıdır. Spesifik olarak, sayılar değilken, dizeler tek tırnaklara sarılır. Alan türünü kontrol edebilir ve bir dize alanı ise tek tırnak ekleyebilirsiniz.

Örneğin:

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)

Yukarıdaki işlevin çok değerli sürümü için bu cevabın işlevine de bakın .


2
İyi fikir. Arcpy yardımcı işlevler modülüme bu işlevi ekledim, böylece arcpy.buildWhereClause
blord-castillo

3

Bunu dene:

Name = 1
study = "StudyID"

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

0

Üçlü tırnak kullanmayı seviyorum. Bence okuması en kolay olanlar onlar. Örneğin,

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

type(name)Size bağlı olarak 'etrafa ihtiyacınız olabilir veya olmayabilir %s. Rakamlar 'için, metin için değil, ihtiyacınız vardır .


0

Benim için bu çözüm, hem değişkene hem de ilgi alanına başka bir değişkeni ikame edebileceğim için en iyi sonucu veriyor.

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.