Com o arcpy, como detecto classes de relacionamento em um arquivo GDB (ou não consigo)?

10

Eu gostaria de poder detectar classes de relacionamento em um arquivo GDB. Como os usuários do meu script podem ter apenas uma licença no nível do ArcView, eles não poderão manipular o esquema de uma classe de recurso (especificamente para adicionar um campo) que esteja em um espaço de trabalho que possua classes de relacionamento. Como detecto a presença de classes de relacionamento, para poder documentá-las, evitá-las programaticamente e permitir que o script continue?

flauta celta
fonte

Respostas:

6

A relationshipClassNamespropriedade deve fazer isso, mas parece não funcionar para mim (testada em um geodatabase de arquivo, criou uma classe de relacionamento entre duas classes de recursos, verificou a propriedade, a lista retornada está vazia para ambas). Talvez funcione para você.

blah238
fonte
Obrigado. Eu estava sentindo falta de como chegar às aulas de relacionamento em primeiro lugar, mas você me deu a pista. Vou verificar a propriedade relationshipClassNames e informar como ela funciona (ou não).
Celticflute 1/11/11
3

De acordo com a sugestão @ blah238, esse código python lista todas as classes de relacionamento em um Geodatabase e as coloca em uma lista exclusiva (relClasses):

inGDB = r"D:\mygeodatabase.gdb"
env.workspace = inGDB
#################Getting all Tables and Feature Classes###########
fcs = []
#root of workspace
for item in arcpy.ListFeatureClasses("*"):    fcs.append(item)
for item in arcpy.ListTables("*"):    fcs.append(item)

fds = arcpy.ListDatasets("*","Feature")
for fd in fds:
    env.workspace = inGDB +'\\'+fd
    for fc in arcpy.ListFeatureClasses("*"):
        fcs.append(fd+'/'+fc)
    for tb in arcpy.ListTables("*"):
        fcs.append(fd+'/'+tb)

env.workspace = inGDB
relClasses = set()
for i,fc in enumerate(fcs): 
    desc = arcpy.Describe(fc)
    for j,rel in enumerate(desc.relationshipClassNames):
        relDesc = arcpy.Describe(rel)
        if relDesc.isAttachmentRelationship:
            continue
        relClasses.add(rel)

print relClasses
Farid Cheraghi
fonte
1

Eu lutei com isso até perceber que o arcpy vê as classes de relacionamento através das tabelas às quais elas estão associadas. Aqui está um pequeno trecho de código para verificar nomes de classes de relacionamento com mais de 30 anos:

arcpy.env.workspace = 'C:/workspace'

# Local variables
tables = arcpy.ListTables()

# Iterate through tables in file geodatabase (workspace)
for t in tables:
    # Get relationship class(es) associated with table
    desc = arcpy.Describe(t)
    rcs = desc.relationshipClassNames
# Iterate through any relationship classes associated with current table in loop
    for r in rcs:
        if len(r) > 30:
            print 'Relationship class ' + r + ' has ' + str(len(r)) + ' characters.'
Ian Yau
fonte
0

Estou no 10.5.1 e parece que o relationshipClassNames está me dando a lista de nomes de classes de relacionamento como deveria

layer = "C:\\Geodatabases\\somegeodatabase.gdb\\my_layer"
desc = arcpy.Describe(layer)
print desc.relationshipClassNames
Aamir Suleman
fonte