Проверка имен таблицы
Для поддержания множества таблиц, составляющих базу геоданных, используются различные реляционные системы управления базами данных (РСУБД). Имя каждой таблицы базы геоданных должно быть корректным, поэтому механизм проверки корректности имени таблицы является ключевым при создании данных в базе геоданных. С помощью функции ValidateTableName() скрипт может определить, является ли конкретное имя корректным для рабочей области.
Ниже перечислены ошибки в именах таблиц, которые будут исправлены:
- Имя таблицы совпадает со словом, которое зарезервировано как источник данных (например, Таблица (Table)).
- Имя таблицы содержит некорректные символы.
- В качестве первого символа в имени таблицы использован некорректный символ (например, число).
Функция | Описание |
---|---|
ValidateTableName(name, {workspace}) | Принимает имя таблицы и путь рабочей области и возвращает корректное имя таблицы для рабочей области. |
Указание рабочей области в качестве параметра позволяет ArcPy проверять существующие имена таблицы и определять наличие каких-либо ограничений имен, установленных выходной рабочей областью. Если выходной рабочею областью является РСУБД, она может содержать зарезервированные слова, которые могут не использоваться в имени таблицы. Она также может содержать некорректные символы, которые не могут использоваться в имени таблицы или поля. Все некорректные символы заменяются символом нижнего подчеркивания (_). Функция ValidateTableName возвращает строку, содержащую корректное имя таблицы, которое может совпадать с входным именем, если входное имя является корректным. Следующий пример демонстрирует порядок создать такого имени нового выходного класса пространственных объектов, созданного с помощью инструмента Копировать объекты (Copy Features), которое будет уникальным и корректным в любой базе геоданных.
# 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)
Проверка имен поля
Каждая база данных может иметь ограничения на задание имен для полей таблицы. Такие объекты, как классы пространственных объектов или классы отношений, сохраняются в виде таблиц в РСУБД. Поэтому эти ограничения действуют не только на отдельные таблицы. Ограничения могут или не могут быть общими для различных систем баз данных, поэтому скрипты должны проверять все новые имена полей, чтобы гарантировать стабильную работу инструмента.
Ниже перечислены ошибки в именах полей, которые будут исправлены:
- Имя поля совпадает со словом, зарезервированным в качестве источника данных (например, Таблица).
- Имя поля совпадает с именем заданного ранее поля.
- Имя поля содержит некорректные символы (например, *).
- Длина имени поля превышает максимальную длину имен полей источника данных.
Функция | Описание |
---|---|
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))
Если скрипт обновляет набор данных, например класс пространственных объектов или таблицу, старайтесь избежать ситуаций, приводящих к блокированию набора данных. Когда вы открываете персональную или файловую базу геоданных в ArcCatalog, скрипт сможет обновить какое-либо содержание базы геоданных только тогда, когда вы снимете с нее отметку и обновите папку или закроете ArcCatalog. Это также относится к инструментам-скриптам: