Définir l'espace de travail pour la connexion SDE en Python

Réponses:

17

DEWright vient de me battre, il a raison, utilisez une connexion comme dans ArcCatalog. Mais voici ma prise de position, effectuée à l'invite Python dans ArcMap, en utilisant le chemin d'accès direct complet à un fichier de connexion 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

>>> 

Pour obtenir le chemin d'accès à mon fichier de connexion SDE, je viens de cliquer avec le bouton droit sur ma base de données SDE dans l'arborescence du catalogue, je suis allé dans les propriétés, puis dans l'onglet Général, copiez le chemin d'accès dans le champ Nom:

entrez la description de l'image ici

Chad Cooper
la source
Merci monsieur, je l'ai maintenant. J'apprécie vraiment votre aide. Merci beaucoup.
Ramakrishna Billakanti
5
Si vous utilisez la fenêtre Python dans ArcCatalog pour créer vos scripts, vous pouvez glisser-déposer votre connexion dans la fenêtre Python et elle formatera le chemin correctement.
Timothy Michael
@TimothyMichael Vous venez de me sauver la vie. Je vous remercie.
ketar
21

Les exemples 3 à 5 de cette page sont étonnants pour ce problème: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000

Voici une version simplifiée que j'ai faite qui me permet de faire des connexions à la volée en python en utilisant uniquement la connexion directe 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

En utilisant ce script, je peux créer un fichier de connexion à la volée en appelant simplement:

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

Cela élimine le problème des fichiers de connexion à la base de données incohérents d'une machine à l'autre ou d'un profil utilisateur à un autre.

blord-castillo
la source
Excellent script, mais j'ai trouvé quelques problèmes mineurs avec lui pendant mon développement. - Il enregistre le mot de passe, mais pas dans le nom de fichier, donc quand j'ai fourni un mot de passe différent, le code a trouvé un fichier de connexion pour la base de données mais ne savait pas que le mot de passe était différent. J'ai changé le nom en md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() - L'indentation sur la publication pour le retour est incorrecte, donc je ne savais pas que ma connexion échouait. - Le code change la version en majuscule, ma version était en minuscule
Bryan
Ouais, si je faisais le script maintenant, il aurait plus d'options pour forcer la création de fichiers (lorsque vous changez le mot de passe).
blord-castillo
10

Vous devez définir votre document de connexion SDE comme vous le feriez normalement dans ArcCatalog; Ensuite, vous allez créer le chemin d'accès à la couche en Python comme ceci:

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

Cela définira votre chemin d'accès à l'emplacement de votre fichier .SDE, mais vous définissez ensuite le chemin d'accès à l'intérieur de cette connexion à la couche que vous recherchez. Dans mon cas, j'ai également défini une variable Année.

DEWright
la source
Salut Wright, Merci pour votre réponse, je ne comprends vraiment pas ce que vous dites, j'ai besoin d'exécuter le géotraitement à partir de mon bureau local en accédant à ma connexion sde sur un serveur différent. J'ai créé une connexion pour le service sde sur le catalogue d'arc. que dois-je faire si je veux accéder aux données de la connexion sde.
Ramakrishna Billakanti
Aujourd'hui, Esri recommande d'utiliser os.path.join pour joindre la variable du fichier de connexion .sde (sdeworkspace) et le nom de l'objet. Ce sera donc indata = os.path.join (sdeworkspace, "FeatureClass").
Alex Tereshenkov
0

vous pouvez également définir le chemin de connexion directement dans votre requête.

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

et l'utiliser dans la recherche et etc.

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