Definire l'area di lavoro per la connessione SDE in Python


Risposte:


17

DEWright mi ha appena battuto, ha ragione, usa una connessione proprio come in ArcCatalog. Ma ecco la mia opinione, fatta al prompt di Python in ArcMap, usando il percorso completo diretto a un file di connessione sde:

>>> import arcpy
>>> arcpy.env.workspace = "C:\\Users\\chad\\AppData\\Roaming\\ESRI\\Desktop10.0\\ArcCatalog\\anrc_water (anrcuser).sde"
>>> fdlist = arcpy.ListDatasets()
>>> for fd in fdlist:
...     print fd
... 
anrc_water.DBO.ChadTest
anrc_water.DBO.Temp_Data
anrc_water.DBO.Master_Datasets
ANRC_WATER.DBO.ENF_FILL_FACC
ANRC_WATER.DBO.ENF_FILL_FDIR

>>> 

Per ottenere il percorso del mio file di connessione sde, ho appena fatto clic con il pulsante destro del mouse sul mio database SDE nella struttura del catalogo, sono andato alle proprietà, quindi nella scheda Generale, copia il percorso dal campo Nome:

inserisci qui la descrizione dell'immagine


Grazie signore, ho capito adesso. Apprezzo molto il vostro aiuto. Molte grazie.
Ramakrishna Billakanti,

5
Se stai usando la finestra di Python in ArcCatalog per creare i tuoi script, puoi trascinare e rilasciare la tua connessione nella finestra di Python e formatterà correttamente il percorso.
Timothy Michael,

@TimothyMichael Mi hai appena salvato la vita. Grazie.
chetar

21

Gli esempi da 3 a 5 in questa pagina sono sorprendenti per questo problema: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000

Ecco una versione semplificata che ho realizzato che mi consente di eseguire al volo connessioni in Python utilizzando solo la connessione diretta Sql Server.

"""
Name: sdeconn.py
Description: Utility functions for sde connections
"""

# Import system modules
import arcpy, os, sys

def connect(database, server="<default server>", username="<default user>", password="<default password>", version="SDE.DEFAULT"):
    # Check if value entered for option
    try:
        #Usage parameters for spatial database connection to upgrade
        service = "sde:sqlserver:" + server 
        account_authentication = 'DATABASE_AUTH'
        version = version.upper()
        database = database.lower()

        # Check if direct connection
        if service.find(":") <> -1:  #This is direct connect
            ServiceConnFileName = service.replace(":", "")
            ServiceConnFileName = ServiceConnFileName.replace(";", "")
            ServiceConnFileName = ServiceConnFileName.replace("=", "")
            ServiceConnFileName = ServiceConnFileName.replace("/", "")
            ServiceConnFileName = ServiceConnFileName.replace("\\", "")
        else:
            arcpy.AddMessage("\n+++++++++")
            arcpy.AddMessage("Exiting!!")
            arcpy.AddMessage("+++++++++")
            sys.exit("\nSyntax for a direct connection in the Service parameter is required for geodatabase upgrade.")

        # Local variables
        Conn_File_NameT = server + "_" + ServiceConnFileName + "_" + database + "_" + username    

        if os.environ.get("TEMP") == None:
            temp = "c:\\temp"   
        else:
            temp = os.environ.get("TEMP")

        if os.environ.get("TMP") == None:
            temp = "/usr/tmp"       
        else:
            temp = os.environ.get("TMP")  

        Connection_File_Name = temp + os.sep + Conn_File_NameT + ".sde"
        if os.path.isfile(Connection_File_Name):
            return Connection_File_Name

        # Check for the .sde file and delete it if present
        arcpy.env.overwriteOutput=True


        # Variables defined within the script; other variable options commented out at the end of the line
        saveUserInfo = "SAVE_USERNAME" #DO_NOT_SAVE_USERNAME
        saveVersionInfo = "SAVE_VERSION" #DO_NOT_SAVE_VERSION


        print "\nCreating ArcSDE Connection File...\n"
        # Process: Create ArcSDE Connection File...
        # Usage: out_folder_path, out_name, server, service, database, account_authentication, username, password, save_username_password, version,   save_version_info
        print temp
        print Conn_File_NameT
        print server
        print service
        print database
        print account_authentication
        print username
        print password
        print saveUserInfo
        print version
        print saveVersionInfo
        arcpy.CreateArcSDEConnectionFile_management(temp, Conn_File_NameT, server, service, database, account_authentication, username, password, saveUserInfo, version, saveVersionInfo)
        for i in range(arcpy.GetMessageCount()):
            if "000565" in arcpy.GetMessage(i):   #Check if database connection was successful
                arcpy.AddReturnMessage(i)
                arcpy.AddMessage("\n+++++++++")
                arcpy.AddMessage("Exiting!!")
                arcpy.AddMessage("+++++++++\n")
                sys.exit(3)            
            else:
                arcpy.AddReturnMessage(i)
                arcpy.AddMessage("+++++++++\n")
                return Connection_File_Name
    #Check if no value entered for option   
    except SystemExit as e:
        print e.code
        return

Usando questo script, posso creare un file di connessione al volo semplicemente chiamando:

import arcpy, sdeconn
myconnect1 = sdeconn.connect("database1", "server")
myconnect2 = sdeconn.connect("database2", "server")

Ciò elimina il problema dei file di connessione al database incoerenti da una macchina all'altra o da un profilo utente a un profilo utente.


Ottima sceneggiatura, ma durante il mio sviluppo ho riscontrato alcuni problemi minori. - Salva la password, ma non come parte del nome del file, quindi quando ho fornito una password diversa il codice ha trovato un file di connessione per il database ma non sapevo che la password fosse diversa. Ho cambiato il nome in md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() - Il rientro sulla registrazione per il reso non è corretto, quindi non sapevo che la mia connessione non riusciva. - Il codice cambia la versione in maiuscolo, la mia versione era in minuscolo
Bryan,

Sì, se avessi creato lo script ora avrebbe alcune altre opzioni per cose come forzare la creazione di file (per quando cambi la password).
blord-castillo,

10

È necessario definire il documento di connessione SDE come si farebbe normalmente in ArcCatalog; Quindi creerai il percorso del livello in Python in questo modo:

DataConnections = "C:\\AGS_GCSS_Tools\\DatabaseConnections\\" 
TCA_Connection = "prod_sde.sde\\prod_SDE.GIS.PropertyTax" + CAPSYear + "\\prod_SDE.GIS.Tca"
TCA_Layer = DataConnections + TCA_Connection

Questo imposterà il percorso in cui risiede il tuo file .SDE, ma poi imposti il ​​percorso all'interno di quella connessione al livello che stai cercando. Nel mio caso ho anche impostato una variabile Year.


Ciao Wright, grazie per la tua risposta, non capisco davvero cosa stai dicendo, devo eseguire il geoprocessing dal mio desktop locale accedendo alla mia connessione sde su un altro server. Ho creato una connessione per il servizio sde sul catalogo arc. cosa devo fare se voglio accedere ai dati dalla connessione sde.
Ramakrishna Billakanti,

Oggi Esri consiglia di utilizzare os.path.join per unire la variabile del file di connessione (sdeworkspace) e il nome dell'oggetto. Quindi sarà indata = os.path.join (sdeworkspace, "FeatureClass").
Alex Tereshenkov,

0

puoi anche definire il percorso di connessione direttamente nella tua query.

PathSdeConnection= "C:\\Users\\{Username Of windows}\\AppData\\Roaming\\ESRI\\Desktop10.2\\ArcCatalog\\{name of ConenctionString}.sde

e usalo nella ricerca e così via

with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","SHAPE@","SHAPE@JSON"),{WhereClause})as cursor:
     for row in cursor:
                       .
                       .
                       . 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.