Сводка
Класс ArcSDESQLExecute предоставляет средства выполнения SQL-выражений с использованием подключения к многопользовательской базе геоданных.
Описание
Внимание:
- Системные таблицы многопользовательской базы геоданных не следует изменять никакими средствами, кроме программного обеспечения ArcGIS. При редактировании данных системных таблиц напрямую с помощью SQL их можно повредить.
- Редактирование версионных данных, выполняемое с помощью SQL, должно производиться только посредством версионных представлений.
- Для баз геоданных, реализованных в системе управления реляционной базой данных (СУБД), с помощью типов данных и форматов таблиц СУБД для работы с информацией, хранимой в базе данных, может использоваться собственный вариант языка SQL этой СУБД.
- Доступ к информации в базе геоданных с помощью SQL позволяет внешним приложениям получать доступ к табличным данным, управляемым базой геоданных. Эти внешние приложения могут быть непространственными приложениями базы данных или пользовательскими пространственными приложениями, разработанными в среде, отличной от ArcObjects. Тем не менее, помните, что SQL-доступ к базе геоданных не учитывает такую функциональность базы геоданных, как топология, сети, наборы данных terrain и другие классы и расширения рабочей области.
- Возможно использование объектов СУБД, таких как триггеры и встроенные процедуры, для поддержки связей между таблицами, которые требуются для определенной функциональности базы геоданных. Но выполнение SQL-команд в отношении базы данных без учета этой дополнительной функциональности, например, использование инструкции INSERT для добавления записей в бизнес-таблицу, обходит функциональность базы геоданных и может нарушить связи между данными в базе геоданных.
- Прежде чем получить доступ к любому из объектов многопользовательской базы геоданных или изменить такой объект, прочтите всю документацию многопользовательской базы геоданных по использованию SQL в отношении объектов базы геоданных в СУБД.
Синтаксис
ArcSDESQLExecute ({server}, {instance}, {database}, {user}, {password})
Parameter | Объяснение | Тип данных |
server | Имя сервера, на котором установлены база данных или действительный файл подключения. | String |
instance | Номер порта. | String |
database | Имя базы данных. | String |
user | Имя пользователя. | String |
password | Пароль для имени пользователя. | String |
Свойства
Владение | Объяснение | Тип данных |
transactionAutoCommit (чтение и запись) | Интервал автоподтверждения (autocommit). Его можно использовать для принудительного промежуточного подтверждения после изменения указанного количества объектов. | Integer |
Обзор метода
Метод | Объяснение |
commitTransaction () | Выражения DML не будут закреплены, пока не будет вызван метод commitTransaction. Примечание:Подтверждение (commit) также может встретится при отключении многопользовательской базы геоданных (см. в документации соответствующей СУБД сведения о том, как СУБД реагирует на отключение во время транзакции). |
execute (sql_statement) | Отправляет SQL-выражение в базу данных через подключение ArcSDE. Если выполнение производится вне транзакции, подтверждение производится автоматически, сразу после выполнения инструкции SQL DML (INSERT, UPDATE, DELETE . .). |
rollbackTransaction () | Откатывает любые DML операции до предыдущего подтверждения. |
startTransaction () | Для управления моментом подтверждения изменений в базе данных вызовите метод startTransaction до вызова метода execute. Начнется выполнение транзакции, и выражения DML не будут закреплены, пока не будет вызван метод commitTransaction. |
Методы
commitTransaction ()
execute (sql_statement)
Parameter | Объяснение | Тип данных |
sql_statement | SQL-выражение. В случае, если инструкция возвращает строки из таблицы, метод execute возвращает список списков; для выражений, не возвращающих строки, возвращаетcя указание об успешном выполнении или ошибке выполнения выражения (True - успешное выполнение; None - ошибка). Инструкции, возвращающие единственное значение из единственной строки, возвращают соответствующий тип значения (string, float, float). | Variant |
rollbackTransaction ()
startTransaction ()
Пример кода
Запрос числа преступлений каждого типа и возврат списка списков типа преступления и числа происшествий.
import arcpy
# Use a connection file to create the connection
egdb = r'Database Connections\Connection to bedrock.sde'
egdb_conn = arcpy.ArcSDESQLExecute(egdb)
table_name = 'vtest.GDB.Crime'
field_name = 'CRIMETYPE'
sql = '''
SELECT {0}, COUNT({0}) AS f_count FROM {1}
GROUP BY {0}
ORDER BY f_count DESC
'''.format(field_name, table_name)
egdb_return = egdb_conn.execute(sql)
for i in egdb_return:
print('{}: {}'.format(*i))
import sys
import arcpy
try:
# Make data path relative
arcpy.env.workspace = sys.path[0]
# Two ways to create the object, which also creates the
# connection to the enterprise geodatabase.
# Using the first method, pass a set of strings containing
# the connection properties:
# <serverName>, <portNumber>, <version>, <userName>, <password>
# arcpy.ArcSDESQLExecute("gpserver3","5151","#","toolbox","toolbox")
# Using the second method pass the path to a valid connection file
egdb_conn = arcpy.ArcSDESQLExecute(r"data\Connection to GPSERVER3.sde")
# Get the SQL statements, separated by ; from a text string.
sql_statement = arcpy.GetParameterAsText(0)
sql_statement_list = sql_statement.split(";")
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
# For each SQL statement passed in, execute it.
for sql in sql_statement_list:
print("Execute SQL Statement: {0}".format(sql))
try:
# Pass the SQL statement to the database.
egdb_return = egdb_conn.execute(sql)
except Exception as err:
print(err)
egdb_return = False
# If the return value is a list (a list of lists), display
# each list as a row from the table being queried.
if isinstance(egdb_return, list):
print("Number of rows returned by query: {0} rows".format(
len(egdb_return)))
for row in egdb_return:
print(row)
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
else:
# If the return value was not a list, the statement was
# most likely a DDL statement. Check its status.
if egdb_return == True:
print("SQL statement: {0} ran successfully.".format(sql))
else:
print("SQL statement: {0} FAILED.".format(sql))
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
except Exception as err:
print(err)
# WARNING - DO NOT USE ON VERSIONED TABLES OR FEATURE CLASSES.
# DO NOT USE ON ANY enterprise geodatabase SYSTEM TABLES.
# DOING SO MAY RESULT IN DATA CORRUPTION.
import sys
import arcpy
try:
# Make data path relative (not relevant unless data is moved
# here and paths modified)
arcpy.env.workspace = sys.path[0]
# Column name:value that should be in the record.
sql_values = {"STREET_NAM": "'EUREKA'"}
# Value that is incorrect if found in the above column.
bad_val = "'EREKA'"
#List of tables to look in for the bad value.
tables = ["streetaddresses_blkA", "streetaddresses_blkB",
"streetaddresses_blkC"]
# Two ways to create the object, which also creates the connection
# to the enterprise geodatabase.
# Using the first method, pass a set of strings containing the
# connection properties:
# <serverName>, <portNumber>, <version>, <userName>, <password>
egdb_conn = arcpy.ArcSDESQLExecute("gpserver3", "5151", "#",
"toolbox", "toolbox")
# Using the second method pass the path to a valid enterprise geodatabase connection file
# arcpy.ArcSDESQLExecute("data\Connection to GPSERVER3.sde")
for tbl in tables:
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
for col, val in list(sql_values.items()):
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
# Check for the incorrect value in the column for the
# specific rows. If the table contains the incorrect value,
# correct it using the update SQL statement.
print("Analyzing table {0} for bad data: "
"Column:{1} Value: {2}".format(tbl, col, bad_val))
try:
sql = "select OBJECTID,{0} from {1} where {0} = {2}".format(
col, tbl, bad_val)
print("Attempt to execute SQL Statement: {0}".format(sql))
egdb_return = egdb_conn.execute(sql)
except Exception as err:
print(err)
egdb_return = False
if isinstance(egdb_return, list):
if len(egdb_return) > 0:
print("Identified {0} rows with incorrect data. Starting "
"transaction for update.".format(len(egdb_return)))
# Start the transaction
egdb_conn.startTransaction()
print("Transaction started...")
# Perform the update
try:
sql = "update {0} set {1}={2} where {1} = {3}".format(
tbl, col, val, bad_val)
print("Changing bad value: {0} to the good value: "
"{1} using update statement:\n {2}".format(
bad_val, val, sql))
egdb_return = egdb_conn.execute(sql)
except Exception as err:
print(err)
egdb_return = False
# If the update completed successfully, commit the
# changes. If not, rollback.
if egdb_return == True:
print("Update statement: \n"
"{0} ran successfully.".format(sql))
# Commit the changes
egdb_conn.commitTransaction()
print("Committed Transaction")
# List the changes.
try:
print("Displaying updated rows for "
"visual inspection.")
sql = "select OBJECTID" + \
",{0} from {1} where {0} = {2}".format(
col, tbl, val)
print("Executing SQL Statement: \n{0}".format(sql))
egdb_return = egdb_conn.execute(sql)
except Exception as err:
print(err)
egdb_return = False
if isinstance(egdb_return, list):
print("{0} rows".format(len(egdb_return)))
for row in egdb_return:
print(row)
print("++++++++++++++++++++++++++++++++++++++++\n")
else:
if egdb_return == True:
print("SQL statement: \n{0}\n"
"ran successfully.".format(sql))
else:
print("SQL statement: \n{0}\n"
"FAILED.".format(sql))
print("++++++++++++++++++++++++++++++++++++++++\n")
print("++++++++++++++++++++++++++++++++++++++++\n")
else:
print("SQL statement: \n{0}\nFAILED. "
"Rolling back all changes.".format(sql))
# Rollback changes
egdb_conn.rollbackTransaction()
print("Rolled back any changes.")
print("++++++++++++++++++++++++++++++++++++++++\n")
else:
print "No records required updating."
# Disconnect and exit
del egdb_conn
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
except Exception as err:
print(err)