Definir espacio de trabajo para conexión SDE en Python

Respuestas:

17

DEWright simplemente me ganó, él está en lo cierto, 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 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, copié la ruta del campo Nombre:

ingrese la descripción de la imagen aquí

Chad Cooper
fuente
Gracias señor, lo tengo ahora. Realmente aprecio tu ayuda. Muchas gracias.
Ramakrishna Billakanti
55
Si está utilizando la ventana de Python en ArcCatalog para crear sus scripts, puede arrastrar y soltar su conexión en la ventana de Python y formateará la ruta correctamente.
Timothy Michael
@TimothyMichael Acabas de salvarme la vida. Gracias.
ketar
21

Los ejemplos 3 a 5 en esta página son sorprendentes para este problema: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000

Aquí hay una versión simplificada que hice que me permite hacer conexiones sobre la marcha en python usando solo la conexión directa de 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

Con este script, puedo hacer 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 máquina a máquina o de perfil de usuario a perfil de usuario.

castillo-blord
fuente
Gran script, pero encontré algunos problemas menores con él durante mi desarrollo. - Guarda la contraseña, pero no como parte del nombre del archivo, por lo que cuando proporcioné una contraseña diferente, el código encontró un archivo de conexión para la base de datos pero no sabía que la contraseña era diferente. Cambié el nombre a md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() : la sangría en la publicación de la devolución es incorrecta, por lo que no sabía que mi conexión estaba fallando. - El código cambia la versión a mayúsculas, mi versión era minúscula
Bryan
Sí, si creara el script ahora, tendría algunas opciones más para cosas como forzar la creación de archivos (para cuando cambie la contraseña).
blord-castillo
10

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 a donde vive su archivo .SDE, pero luego establecerá la ruta dentro de esa conexión a la capa que está buscando. En mi caso, también configuré una variable Año.

DEWright
fuente
Hola Wright, gracias por tu respuesta. Realmente no entiendo lo que estás diciendo. Necesito ejecutar el geoprocesamiento desde mi escritorio local para acceder a mi conexión SDE en un servidor diferente. Tengo una conexión creada para el servicio sde en el catálogo de arco. ¿Qué debo hacer si quiero acceder a los datos de la conexión SDE?
Ramakrishna Billakanti
Hoy en día, Esri recomienda usar os.path.join para unir la variable del archivo de conexión .sde (sdeworkspace) y el nombre del objeto. Entonces será indata = os.path.join (sdeworkspace, "FeatureClass").
Alex Tereshenkov
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 usarlo en Búsqueda y etc.

with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","SHAPE@","SHAPE@JSON"),{WhereClause})as cursor:
     for row in cursor:
                       .
                       .
                       . 
Bahman Rashidi
fuente