กำหนดพื้นที่ทำงานสำหรับการเชื่อมต่อ SDE ใน Python


14

เราจะกำหนด SDE Connection สำหรับพื้นที่ทำงานใน Python Scripting ได้อย่างไร


คำตอบ:


17

Dewright เพิ่งเอาชนะฉันไปได้เขาพูดถูกใช้การเชื่อมต่อเหมือนใน ArcCatalog แต่นี่คือสิ่งที่ฉันทำได้ที่พรอมต์ Python ใน ArcMap โดยใช้พา ธ แบบเต็มไปยังไฟล์การเชื่อมต่อ 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

>>> 

เพื่อให้ได้พา ธ ไปยังไฟล์การเชื่อมต่อ sde ของฉันฉันเพียงคลิกขวาที่ฐานข้อมูล SDE ของฉันในแผนผังแคตตาล็อกไปที่คุณสมบัติจากนั้นบนแท็บทั่วไปคัดลอกพา ธ จากฟิลด์ชื่อ:

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณครับผมได้รับแล้ว ผมขอขอบคุณความช่วยเหลือของคุณ. ขอบคุณมาก.
Ramakrishna Billakanti

5
หากคุณใช้หน้าต่าง Python ใน ArcCatalog เพื่อสร้างสคริปต์ของคุณคุณสามารถลากและวางการเชื่อมต่อของคุณลงในหน้าต่าง Python และมันจะจัดรูปแบบเส้นทางที่เหมาะสม
Timothy Michael

@TimothyMichael คุณช่วยชีวิตฉันไว้ ขอขอบคุณ.
ketar

21

ตัวอย่างที่ 3 ถึง 5 ในหน้านี้น่าทึ่งสำหรับปัญหานี้: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000

นี่เป็นเวอร์ชั่นที่เรียบง่ายที่ฉันสร้างขึ้นซึ่งทำให้ฉันสามารถทำการเชื่อมต่อได้ทันทีใน python โดยใช้ 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

ด้วยการใช้สคริปต์นี้ฉันสามารถสร้างไฟล์เชื่อมต่อได้อย่างง่ายดายเพียงแค่โทร:

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

สิ่งนี้จะช่วยขจัดปัญหาไฟล์เชื่อมต่อฐานข้อมูลที่ไม่สอดคล้องกันจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่งหรือโปรไฟล์ผู้ใช้ไปยังโปรไฟล์ผู้ใช้


สคริปต์ที่ยอดเยี่ยม แต่ฉันพบปัญหาเล็กน้อยในระหว่างการพัฒนาของฉัน - มันบันทึกรหัสผ่าน แต่ไม่ได้เป็นส่วนหนึ่งของชื่อไฟล์ดังนั้นเมื่อฉันให้รหัสผ่านที่แตกต่างกันรหัสพบไฟล์การเชื่อมต่อสำหรับฐานข้อมูล แต่ไม่ทราบว่ารหัสผ่านนั้นแตกต่างกัน ฉันเปลี่ยนชื่อเป็นmd5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest() - การเยื้องการโพสต์สำหรับการส่งคืนนั้นไม่ถูกต้องดังนั้นฉันจึงไม่รู้ว่าการเชื่อมต่อของฉันล้มเหลว - รหัสเปลี่ยนเวอร์ชั่นเป็นตัวพิมพ์ใหญ่เวอร์ชันของฉันเป็นตัวพิมพ์เล็ก
ไบรอัน

ใช่ถ้าฉันสร้างสคริปต์ตอนนี้มันจะมีตัวเลือกเพิ่มเติมสำหรับสิ่งต่าง ๆ เช่นบังคับให้สร้างไฟล์ (สำหรับเมื่อคุณเปลี่ยนรหัสผ่าน)
blord-castillo

10

คุณต้องกำหนดเอกสารการเชื่อมต่อ SDE ของคุณตามปกติใน ArcCatalog จากนั้นคุณจะสร้างเส้นทางไปยังเลเยอร์ใน Python ดังนี้:

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

สิ่งนี้จะกำหนดเส้นทางของคุณไปยังที่ที่ไฟล์. SDE ของคุณมีชีวิตอยู่ แต่จากนั้นคุณกำหนดเส้นทางภายในการเชื่อมต่อนั้นไปยังเลเยอร์ที่คุณต้องการ ในกรณีของฉันฉันยังตั้งค่าตัวแปรปี


สวัสดี Wright ขอขอบคุณสำหรับการตอบกลับของคุณฉันไม่เข้าใจสิ่งที่คุณพูดฉันต้องการเรียกใช้กระบวนการทางภูมิศาสตร์จากเดสก์ท็อปท้องถิ่นของฉันเพื่อเข้าถึงการเชื่อมต่อ sde ของฉันบนเซิร์ฟเวอร์อื่น ฉันมีการเชื่อมต่อที่สร้างขึ้นสำหรับบริการ sde ในแค็ตตาล็อก arc ฉันควรทำอย่างไรหากต้องการเข้าถึงข้อมูลจากการเชื่อมต่อ sde
Ramakrishna Billakanti

ปัจจุบัน Esri แนะนำให้ใช้ os.path.join สำหรับการเข้าร่วมตัวแปร. sde ไฟล์การเชื่อมต่อ (sdeworkspace) และชื่อวัตถุ ดังนั้นมันจะเป็น indata = os.path.join (sdeworkspace, "FeatureClass")
Alex Tereshenkov

0

คุณยังสามารถกำหนดเส้นทางของการเชื่อมต่อโดยตรงใน Query ของคุณ

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

และใช้ในการค้นหาและอื่น ๆ

with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","SHAPE@","SHAPE@JSON"),{WhereClause})as cursor:
     for row in cursor:
                       .
                       .
                       . 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.