Definieren Sie den Arbeitsbereich für die SDE-Verbindung in Python

Antworten:

17

DEWright hat mich nur geschlagen, er hat Recht, verwendet eine Verbindung wie in ArcCatalog. Aber hier ist meine Einstellung, die an der Python-Eingabeaufforderung in ArcMap vorgenommen wurde und den direkten vollständigen Pfad zu einer SDE-Verbindungsdatei verwendet:

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

>>> 

Um den Pfad zu meiner SDE-Verbindungsdatei zu erhalten, habe ich einfach mit der rechten Maustaste auf meine SDE-Datenbank in der Katalogstruktur geklickt, die Eigenschaften aufgerufen und auf der Registerkarte Allgemein den Pfad aus dem Feld Name kopiert:

Bildbeschreibung hier eingeben

Chad Cooper
quelle
Vielen Dank, Sir, ich habe es jetzt verstanden. Ich schätze deine Hilfe sehr. Danke vielmals.
Ramakrishna Billakanti
5
Wenn Sie das Python-Fenster in ArcCatalog zum Erstellen Ihrer Skripte verwenden, können Sie Ihre Verbindung per Drag & Drop in das Python-Fenster ziehen. Der Pfad wird dann ordnungsgemäß formatiert.
Timothy Michael
@ TimothyMichael Du hast mir gerade das Leben gerettet. Vielen Dank.
ketar
21

Die Beispiele 3 bis 5 auf dieser Seite sind erstaunlich für dieses Problem: http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//0017000000q7000000

Hier ist eine vereinfachte Version, die ich erstellt habe und die es mir ermöglicht, spontane Verbindungen in Python nur mit SQL Server Direct Connect herzustellen.

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

Mit diesem Skript kann ich eine Verbindungsdatei im Handumdrehen erstellen, indem ich einfach aufrufe:

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

Dadurch wird das Problem beseitigt, dass Datenbankverbindungsdateien von Computer zu Computer oder Benutzerprofil zu Benutzerprofil inkonsistent sind.

Blord-Castillo
quelle
Tolles Drehbuch, aber ich habe während meiner Entwicklung ein paar kleinere Probleme damit gefunden. - Das Kennwort wird gespeichert, jedoch nicht als Teil des Dateinamens. Wenn ich ein anderes Kennwort eingegeben habe, hat der Code eine Verbindungsdatei für die Datenbank gefunden, wusste jedoch nicht, dass das Kennwort anders ist. Ich habe den Namen in geändert. md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() Der Einzug auf dem Posting für die Rücksendung ist nicht korrekt. Daher wusste ich nicht, dass meine Verbindung fehlschlug. - Der Code ändert die Version in Großbuchstaben, meine Version war Kleinbuchstaben
Bryan
Ja, wenn ich das Skript jetzt erstellen würde, hätte es einige weitere Optionen, um die Dateierstellung zu erzwingen (zum Beispiel, wenn Sie das Passwort ändern).
Blord-Castillo
10

Sie müssen Ihr SDE-Verbindungsdokument so definieren, wie Sie es normalerweise in ArcCatalog tun würden. Dann erstellen Sie den Pfad zur Ebene in Python wie folgt:

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

Hiermit legen Sie den Pfad zum Speicherort Ihrer .SDE-Datei fest. Anschließend legen Sie den Pfad innerhalb dieser Verbindung auf die gesuchte Ebene fest. In meinem Fall habe ich auch eine Year-Variable gesetzt.

DEWright
quelle
Hallo Wright, vielen Dank für Ihre Antwort. Ich verstehe nicht wirklich, was Sie sagen. Ich muss die Geoverarbeitung von meinem lokalen Desktop ausführen und auf meine SDE-Verbindung auf einem anderen Server zugreifen. Ich habe eine Verbindung für den SDE-Dienst auf Arc Catalog erstellt. Was soll ich tun, wenn ich über die SDE-Verbindung auf Daten zugreifen möchte?
Ramakrishna Billakanti
Heutzutage empfiehlt Esri, os.path.join zu verwenden, um die Variable .sde connection file (sdeworkspace) und den Objektnamen zu verknüpfen. Es wird also indata = os.path.join (sdeworkspace, "FeatureClass") sein.
Alex Tereshenkov
0

Sie können den Verbindungspfad auch direkt in Ihrer Abfrage definieren.

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

und benutze es in der Suche und so weiter.

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