Avec arcpy, comment puis-je détecter les classes de relations dans un fichier GDB (ou je ne peux pas)?

10

Je voudrais pouvoir détecter des classes de relations dans un fichier GDB. Étant donné que les utilisateurs de mon script peuvent n'avoir qu'une licence de niveau ArcView, ils ne pourraient pas manipuler le schéma d'une classe d'entités (en particulier pour ajouter un champ) qui se trouve dans un espace de travail qui a des classes de relations. Comment détecter la présence de classes de relations, afin de pouvoir les documenter, les éviter par programme et permettre au script de continuer?

flûte celtique
la source

Réponses:

6

La relationshipClassNamespropriété est censée faire cela mais cela ne semble pas fonctionner pour moi (testé dans une géodatabase fichier, créé une classe de relations entre deux classes d'entités, vérifié la propriété, la liste renvoyée est vide pour les deux). Peut-être que cela fonctionnera pour vous.

blah238
la source
Merci. En premier lieu, je ne savais pas comment me rendre aux cours sur les relations, mais tu m'as donné un indice. Je vais vérifier la propriété relationClassNames et vous faire savoir comment cela fonctionne (ou non).
celticflute
3

Conformément à la suggestion @ blah238, ce code python répertorie toutes les classes de relations au sein d'une géodatabase et les place dans une liste unique (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
la source
1

J'ai lutté avec cela jusqu'à ce que je réalise qu'arcpy voit les classes de relations à travers les tables auxquelles elles sont associées. Voici un petit morceau de code pour vérifier les noms de classe de relations supérieurs à 30:

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
la source
0

Je suis à 10.5.1 et il semble que la relationClassNames me donne la liste des noms de classe de relation comme il est censé le faire

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