Tentukan Workspace untuk Koneksi SDE di Python

Jawaban:

17

DEWright baru saja mengalahkan saya untuk itu, dia benar, gunakan koneksi seperti di ArcCatalog. Tapi inilah pendapat saya, dilakukan pada prompt Python di ArcMap, menggunakan path lengkap langsung ke file koneksi 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

>>> 

Untuk mendapatkan path ke file koneksi sde saya, saya hanya mengklik kanan pada database SDE saya di pohon Katalog, pergi ke properti, lalu pada tab General, salin path dari bidang Nama:

masukkan deskripsi gambar di sini

Chad Cooper
sumber
Terima kasih tuan, saya mengerti sekarang. Saya sangat menghargai bantuan Anda. Terima kasih banyak.
Ramakrishna Billakanti
5
Jika Anda menggunakan jendela Python di ArcCatalog untuk membuat skrip, Anda dapat menyeret & menjatuhkan koneksi Anda ke jendela Python dan itu akan memformat jalur dengan benar.
Timothy Michael
@TimothyMichael Anda baru saja menyelamatkan hidup saya. Terima kasih.
ketar
21

Contoh 3 hingga 5 di halaman ini luar biasa untuk masalah ini: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//001700000000700000000

Ini adalah versi sederhana yang saya buat yang memungkinkan saya melakukan koneksi fly in python hanya menggunakan Sql Server direct connect saja.

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

Dengan menggunakan skrip ini, saya dapat membuat file koneksi dengan cepat hanya dengan menelepon:

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

Ini menghilangkan masalah file koneksi database yang tidak konsisten dari mesin ke mesin atau profil pengguna ke profil pengguna.

tuan-castillo
sumber
Skrip yang bagus, tetapi saya menemukan beberapa masalah kecil dengan itu selama pengembangan saya. - Ini menyimpan kata sandi, tetapi bukan sebagai bagian dari nama file, jadi ketika saya memberikan kata sandi yang berbeda, kode menemukan file koneksi untuk database tetapi tidak tahu kata sandi itu berbeda. Saya mengubah namanya menjadi md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() - Lekukan pada postingan pengembalian tidak benar, jadi saya tidak tahu koneksi saya gagal. - Kode mengubah versi ke huruf besar, versi saya huruf kecil
Bryan
Ya, jika saya membuat skrip sekarang, ia akan memiliki beberapa opsi lagi untuk hal-hal seperti memaksa pembuatan file (untuk saat Anda mengubah kata sandi).
tuan-castillo
10

Anda perlu mendefinisikan dokumen koneksi SDE Anda seperti biasanya di ArcCatalog; Maka Anda akan membuat path ke layer di Python seperti ini:

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

Ini akan mengatur jalur Anda ke tempat file .SDE Anda tinggal, tetapi kemudian Anda menetapkan jalur di dalam koneksi itu ke lapisan yang Anda cari. Dalam kasus saya, saya juga menetapkan variabel Tahun.

Benar
sumber
Hai Wright, Terima kasih atas tanggapan Anda, saya benar-benar tidak mengerti apa yang Anda katakan, saya perlu menjalankan geoprocessing dari desktop lokal saya mengakses koneksi sde saya di server yang berbeda. Saya memiliki koneksi yang dibuat untuk layanan sde pada katalog arc. apa yang harus saya lakukan jika ingin mengakses data dari koneksi sde.
Ramakrishna Billakanti
Saat ini Esri merekomendasikan penggunaan os.path.join untuk bergabung dengan variabel koneksi file .sde (sdeworkspace) dan nama objek. Jadi itu akan menjadi indata = os.path.join (sdeworkspace, "FeatureClass").
Alex Tereshenkov
0

Anda juga dapat menentukan jalur koneksi langsung di Permintaan Anda.

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

dan menggunakannya dalam Pencarian dan lain-lain

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