जिसमें चर को शामिल करना है जहां arcpy.Select_analysis () का क्लॉज है?


21

मैं एक आकृतिफाइल के माध्यम से लूप करने की कोशिश कर रहा हूं, प्रत्येक विशेषता को बारी-बारी से चुनता है और इसे संघ के विश्लेषण में शामिल करके एक अस्थायी शेपफाइल की प्रतिलिपि बनाता है। मैं प्रत्येक सुविधा के लिए आईडी नाम खोजने के लिए एक कर्सर का उपयोग कर रहा हूं जिसे मैं एक 'नाम' के लिए सेट कर रहा हूं। जब भी मैं इस चर का उपयोग करने की कोशिश करता हूं, जहां खण्ड में खंड के रूप में उपयोग किया जाता है। सेलेक्ट_अनलिसिस मुझे एक त्रुटि मिलती है:

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\'')

यह बढ़िया काम करता है

चर कथन में चर को फिट करने के लिए मुझे क्या करने की आवश्यकता है?

जवाबों:


14

एक और, शायद सरल, तरीका है:

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

2
"आर्कजीआईएस 10 (या, संभवतः, बाद में) का उपयोग करते समय, फ़ील्ड नामों को उद्धृत करने की आवश्यकता नहीं है" यह गलत है; क्षेत्र परिसीमन को अंतर्निहित DBMS के सिंटैक्स नियमों के अनुसार निर्दिष्ट किया जाना चाहिए। मेरा जवाब देखिए।
blah238

उपरोक्त टिप्पणी एक गुमनाम संपादन के जवाब में थी जिसे मैंने इस उत्तर की शुद्धता के लिए वापस ले लिया था।
blah238

यदि Nameउपयोगकर्ता इनपुट से आता है तो क्या यह SQL इंजेक्शन भेद्यता नहीं है?
jpmc26

22

एक बात जो WHERE लिखने को बहुत आसान बना देती है वह है AddFieldDelimitersफंक्शन का उपयोग करना, जो स्वतः ही सही को जोड़ देता है, फ़ील्ड पहचानकर्ताओं के लिए DBMS-विशिष्ट सीमांकक, जैसे कि 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.buildWhereClause के रूप में परिभाषित किया गया है
ब्लॉर्ड-कास्टिलो

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.