Come definiamo la connessione SDE per l'area di lavoro in Python Scripting?
Come definiamo la connessione SDE per l'area di lavoro in Python Scripting?
Risposte:
DEWright mi ha appena battuto, ha ragione, usa una connessione proprio come in ArcCatalog. Ma ecco la mia opinione, fatta al prompt di Python in ArcMap, usando il percorso completo diretto a un file di connessione 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
>>>
Per ottenere il percorso del mio file di connessione sde, ho appena fatto clic con il pulsante destro del mouse sul mio database SDE nella struttura del catalogo, sono andato alle proprietà, quindi nella scheda Generale, copia il percorso dal campo Nome:
Gli esempi da 3 a 5 in questa pagina sono sorprendenti per questo problema: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//0017000000q7000000
Ecco una versione semplificata che ho realizzato che mi consente di eseguire al volo connessioni in Python utilizzando solo la connessione diretta 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
Usando questo script, posso creare un file di connessione al volo semplicemente chiamando:
import arcpy, sdeconn
myconnect1 = sdeconn.connect("database1", "server")
myconnect2 = sdeconn.connect("database2", "server")
Ciò elimina il problema dei file di connessione al database incoerenti da una macchina all'altra o da un profilo utente a un profilo utente.
md5.new( server + "_" + ServiceConnFileName + "_" + database + "-" + version + "_" + username + password).hexdigest()
- Il rientro sulla registrazione per il reso non è corretto, quindi non sapevo che la mia connessione non riusciva. - Il codice cambia la versione in maiuscolo, la mia versione era in minuscolo
È necessario definire il documento di connessione SDE come si farebbe normalmente in ArcCatalog; Quindi creerai il percorso del livello in Python in questo modo:
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
Questo imposterà il percorso in cui risiede il tuo file .SDE, ma poi imposti il percorso all'interno di quella connessione al livello che stai cercando. Nel mio caso ho anche impostato una variabile Year.
puoi anche definire il percorso di connessione direttamente nella tua query.
PathSdeConnection= "C:\\Users\\{Username Of windows}\\AppData\\Roaming\\ESRI\\Desktop10.2\\ArcCatalog\\{name of ConenctionString}.sde
e usalo nella ricerca e così via
with arcpy.da.SearchCursor(PathSdeConnection,("OBJECTID","SHAPE@","SHAPE@JSON"),{WhereClause})as cursor:
for row in cursor:
.
.
.