Definir el área de trabajo para la conexión SDE en Python

13

¿Cómo definimos la conexión SDE para el área de trabajo en Python Scripting?

    
pregunta Ramakrishna Billakanti 14.11.2011 - 20:38

4 respuestas

16

D.E.Wright acaba de vencerme, tiene razón, usa una conexión como en ArcCatalog. Pero aquí está mi opinión, realizada en el indicador de Python en ArcMap, utilizando la ruta completa y directa a un archivo de conexión 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

>>> 

Para obtener la ruta a mi archivo de conexión sde, simplemente hice clic derecho en mi base de datos SDE en el árbol de catálogo, fui a propiedades, luego en la pestaña General, copio la ruta desde el campo Nombre:

    
respondido por el Chad Cooper 14.11.2011 - 21:01
21

Los ejemplos 3 a 5 de esta página son sorprendentes para este problema: enlace

Esta es una versión simplificada que realicé y que me permite hacer conexiones sobre la marcha en python utilizando solo la conexión directa del servidor Sql.

"""
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

Al usar este script, puedo crear un archivo de conexión sobre la marcha simplemente llamando:

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

Esto elimina el problema de que los archivos de conexión de la base de datos sean inconsistentes de una máquina a otra o de un perfil de usuario a otro.

    
respondido por el blord-castillo 18.11.2011 - 16:37
9

Debe definir su documento de conexión SDE como lo haría normalmente en ArcCatalog; Luego, creará la ruta a la capa en Python de esta manera:

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

Esto establecerá su ruta de acceso al lugar donde vive su archivo .SDE, pero luego establece la ruta dentro de esa conexión a la capa que está buscando. En mi caso, también configuro una variable Año.

    
respondido por el D.E.Wright 14.11.2011 - 20:44
0

también puede definir la ruta de conexión directamente en su consulta.

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

y utilícelo en la búsqueda y etc.

with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","[email protected]","[email protected]"),{WhereClause})as cursor:
     for row in cursor:
                       .
                       .
                       . 
    
respondido por el Bahman Rashidi 18.09.2017 - 09:22

Lea otras preguntas en las etiquetas