Проверка имен таблицы
Для поддержания множества таблиц, составляющих базу геоданных, используются различные реляционные системы управления базами данных (РСУБД). Имя каждой таблицы базы геоданных должно быть корректным, поэтому механизм проверки корректности имени таблицы является ключевым при создании данных в базе геоданных. С помощью функции ValidateTableName() скрипт может определить, является ли конкретное имя корректным для рабочей области.
Ниже перечислены ошибки в именах таблиц, которые будут исправлены:
- Имя таблицы совпадает со словом, которое зарезервировано как источник данных (например, Table).
- Имя таблицы содержит некорректные символы.
- В качестве первого символа в имени таблицы использован некорректный символ (например, число).
Функция | Объяснение |
---|---|
ValidateTableName(name, {workspace}) | Принимает имя таблицы и путь рабочей области и возвращает корректное имя таблицы для рабочей области. |
Указание рабочей области в качестве параметра позволяет ArcPy проверять существующие имена таблицы и определять наличие каких-либо ограничений имен, установленных выходной рабочей областью. Если выходной рабочею областью является РСУБД, она может содержать зарезервированные слова, которые могут не использоваться в имени таблицы. Она также может содержать некорректные символы, которые не могут использоваться в имени таблицы или поля. Некорректные символы заменяются на символ подчеркивания (_). ValidateTableName возвращает строку, содержащую корректное имя таблицы, которое может совпадать с входным именем, если входное имя является корректным. Следующий пример демонстрирует порядок создать такого имени нового выходного класса пространственных объектов, созданного с помощью инструмента Копировать объекты, которое будет уникальным и корректным в любой базе геоданных.
"""Move all shapefiles from a folder into a geodatabase"""
import arcpy
# Set the workspace. List all of the shapefiles
arcpy.env.workspace = "d:/St_Johns"
fcs = arcpy.ListFeatureClasses("*")
# Set the workspace to SDE for ValidateTableName
arcpy.env.workspace = "Database Connections/Bluestar.sde"
# For each feature class name
for fc in fcs:
# Validate the output name so it is valid
outfc = arcpy.ValidateTableName(fc)
# Copy the features from the workspace to a geodatabase
arcpy.CopyFeatures_management(fc, outfc)
Проверка имен поля
Каждая база данных может иметь ограничения на задание имен для полей таблицы. Такие объекты, как классы пространственных объектов или классы отношений, сохраняются в виде таблиц в РСУБД. Поэтому эти ограничения действуют не только на отдельные таблицы. Ограничения могут или не могут быть общими для различных систем баз данных, поэтому скрипты должны проверять все новые имена полей, чтобы гарантировать стабильную работу инструмента.
Ниже перечислены ошибки в именах полей, которые будут исправлены:
- Имя поля совпадает со словом, которое зарезервировано как источник данных (например, Table).
- Имя поля совпадает с именем заданного ранее поля.
- Имя поля содержит некорректные символы (например, *).
- Длина имени поля превышает максимальную длину имен полей источника данных.
Функция | Объяснение |
---|---|
ValidateFieldName(name, {workspace}) | Принимает строку (имя поля) и путь рабочей области и возвращает корректное имя поля, созданное с учетом ограничений на задание имен в выходной базе геоданных. |
Следующий пример демонстрирует порядок добавления поля независимо от входного имени с помощью функции ValidateFieldName:
"""
Create a new numeric field containing the ratio of polygon area to
polygon perimeter. Two arguments, a feature class and field name,
are expected.
"""
# Define a pair of simple exceptions for error handling
class ShapeError(Exception):
pass
class FieldError(Exception):
pass
import arcpy
import os
try:
# Get the input feature class and make sure it contains polygons
input = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(input)
if desc.shapeType.lower() != "polygon":
raise ShapeError
# Get the new field name and validate it
fieldname = arcpy.GetParameterAsText(1)
fieldname = arcpy.ValidateFieldName(fieldname, os.path.dirname(input))
# Make sure shape_length and shape_area fields exist
if len(arcpy.ListFields(input, "Shape_area")) > 0 and \
len(arcpy.ListFields(input, "Shape_length")) > 0:
# Add the new field and calculate the value
#
arcpy.AddField_management(input, fieldname, "double")
arcpy.CalculateField_management(input, fieldname,
"[Shape_area] / [Shape_length]")
else:
raise FieldError
except ShapeError:
print("Input does not contain polygons")
except FieldError:
print("Input does not contain shape area and length fields")
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))