ArcSDESQLExecute (arcpy)

Краткая информация

Класс ArcSDESQLExecute предоставляет средства выполнения SQL-выражений с использованием подключения ArcSDE.

Обсуждение

ВниманиеВнимание:
  • Системные таблицы ArcSDE и базы геоданных не следует изменять другими средствами кроме программного обеспечения ArcGIS. При редактировании данных системных таблиц напрямую с помощью SQL их можно повредить.
  • Редактирование версионных данных, выполняемое с помощью SQL, должно производиться только посредством версионных представлений.
  • Для баз геоданных, реализованных в системе управления реляционной базой данных (СУБД), с помощью типов данных и форматов таблиц СУБД для работы с информацией, хранимой в базе данных, может использоваться собственный SQL этой СУБД.
  • Доступ к информации в базе геоданных с помощью SQL позволяет внешним приложениям получать доступ к табличным данным, управляемым базой геоданных. Эти внешние приложения могут быть непространственными приложениями базы данных или пользовательскими пространственными приложениями, разработанными в среде, отличной от ArcObjects. Тем не менее, помните, что SQL-доступ к базе геоданных не учитывает такую функциональность базы геоданных, как топология, сети, наборы данных terrain и другие классы и расширения рабочего пространства.
  • Возможно использование объектов СУБД, таких как триггеры и встроенные процедуры, для поддержки связей между таблицами, которые требуются для определенной функциональности базы геоданных. Но выполнение SQL-команд в отношении базы данных без учета этой дополнительной функциональности – например использование инструкции INSERT для добавления записей в бизнес-таблицу – обходит функциональность базы геоданных и может повредить связи между данными в базе геоданных.
  • Прежде чем производить доступ к любому из объектов ArcSDE или базы геоданных или изменять такой объект, прочтите всю документацию ArcSDE и базы геоданных по использованию SQL в отношении объектов ArcSDE и базы геоданных в СУБД.

Синтаксис

ArcSDESQLExecute ({server}, {instance}, {database}, {user}, {password})
ПараметрОбъяснениеТип данных
server

Имя сервера, на котором установлены база данных или действительный файл подключения.

String
instance

Номер порта.

String
database

Имя базы данных.

String
user

Имя пользователя.

String
password

Пароль для имени пользователя.

String

Свойства

СвойствоОбъяснениеТип данных
transactionAutoCommit
(чтение и запись)

Интервал автоподтверждения (autocommit). Его можно использовать для принудительного промежуточного подтверждения после изменения указанного количества объектов.

Integer

Обзор метода

МетодОбъяснение
commitTransaction ()

Никакие выражения DML не будут подтверждены, пока не будет вызван метод commitTransaction.

ПримечаниеПримечание:

Подтверждение также может производиться при отсоединении ArcSDE (см. в документации соответствующей СУБД сведения о том, как СУБД реагирует на отсоединение во время транзакции).

execute (sql_statement)

Отправляет SQL-выражение в базу данных через подключение ArcSDE. Если выполнение производится вне транзакции, подтверждение производится автоматически, сразу после выполнения инструкции SQL DML (INSERT, UPDATE, DELETE . .).

rollbackTransaction ()

Откатывает любые DML операции до предыдущего подтверждения.

startTransaction ()

Для контроля времени, когда изменения будут подтверждены в базе данных, вызовите метод startTransaction до вызова метода execute. Будет запущена транзакция, и никакие выражения DML не будут подтверждены, пока не будет вызван метод commitTransaction.

Методы

commitTransaction ()
execute (sql_statement)
ПараметрОбъяснениеТип данных
sql_statement

SQL-выражение.

В случае, если инструкция возвращает строки из таблицы, метод execute возвращает список списков; для выражений, не возвращающих строки, возвращаетcя указание об успешном выполнении или ошибке выполнения выражения (True - успешное выполнение; None - ошибка). Инструкции, возвращающие единственное значение из единственной строки, возвращают соответствующий тип значения (string, float, float).

Variant
rollbackTransaction ()
startTransaction ()

Пример кода

Запрос числа преступлений каждого типа и возврат списка списков типа преступления и числа происшествий.

import arcpy

# Use an sde connection file to create the connection
sde = r'Database Connections\Connection to bedrock.sde'
sde_conn = arcpy.ArcSDESQLExecute(sde)

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)

sde_return = sde_conn.execute(sql)
for i in sde_return:
    print('{}: {}'.format(*i))
Выполнение списка SQL-инструкций
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 ArcSDE.
    # 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 ArcSDE connection file
    sde_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.
            sde_return = sde_conn.execute(sql)
        except Exception as err:
            print(err)
            sde_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(sde_return, list):
            print("Number of rows returned by query: {0} rows".format(
                len(sde_return)))
            for row in sde_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 sde_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 ArcSDE or GDB 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 ArcSDE.
    # Using the first method, pass a set of strings containing the
    #   connection properties:
    #   <serverName>, <portNumber>, <version>, <userName>, <password>
    sde_conn = arcpy.ArcSDESQLExecute("gpserver3", "5151", "#",
                                      "toolbox", "toolbox")

    # Using the second method pass the path to a valid ArcSDE connection file
    #   arcpy.ArcSDESQLExecute("data\Connection to GPSERVER3.sde")

    for tbl in tables:
        print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
        for col, val in 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))
                sde_return = sde_conn.execute(sql)
            except Exception as err:
                print(err)
                sde_return = False

            if isinstance(sde_return, list):
                if len(sde_return) > 0:
                    print("Identified {0} rows with incorrect data. Starting "
                          "transaction for update.".format(len(sde_return)))
                    # Start the transaction
                    sde_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))
                        sde_return = sde_conn.execute(sql)
                    except Exception as err:
                        print(err)
                        sde_return = False

                    # If the update completed successfully, commit the
                    # changes.  If not, rollback.
                    if sde_return == True:
                        print("Update statement: \n"
                              "{0} ran successfully.".format(sql))
                        # Commit the changes
                        sde_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))
                            sde_return = sde_conn.execute(sql)
                        except Exception as err:
                            print(err)
                            sde_return = False

                        if isinstance(sde_return, list):
                            print("{0} rows".format(len(sde_return)))
                            for row in sde_return:
                                print(row)
                            print("++++++++++++++++++++++++++++++++++++++++\n")
                        else:
                            if sde_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
                        sde_conn.rollbackTransaction()
                        print("Rolled back any changes.")
                        print("++++++++++++++++++++++++++++++++++++++++\n")
            else:
                print "No records required updating."

    # Disconnect and exit
    del sde_conn
    print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

except Exception as err:
    print(err)

Связанные темы

5/10/2014