Импорт/Экспорт
Экспорт
Некоторые форматы данных поддерживаются ГИС Аксиома только на импорт и/или
экспорт. Не для всех форматом можно создать, открывать и редактировать данные,
используя транзакционную модель редактирования, являющуюся основной для ГИС Аксиома.
Тем не менее экспорт и создание очень близки по назначению, поэтому они
объединены и представлены одним типом axipy.Destination
- назначение
объекта данных.
Так для некоторых типов экспорт axipy.Destination.export()
является
единственной возможностью вывода, в то время как для других - это дополнительная
возможность к имеющейся axipy.Destination.create_open()
в случаях,
когда открытие и редактирование не требуется.
Экспортировать можно отдельные записи, таблицы или целые источники данных.
# Открываем исходную таблицу
table_src = provider_manager.openfile(input_filepath)
# Формируем целевую и производим экспорт
destination = provider_manager.csv.get_destination(output_filepath, Schema())
destination.export_from_table(table_src, copy_schema=True)
Если требуется создать таблицу и занести в нее некоторую информацию, но при этом формат данных не поддерживается на изменение, эту проблему можно решить, используя временную таблицу как буфер. Т.е. формируем данные в памяти, а потом производим экспорт этой временной таблицы в нужный нам формат.
# Создаем временную таблицу
definition = {
'src': '',
'schema': attr.schema(
attr.integer('id'),
attr.string('name')
)
}
table_src = provider_manager.create(definition)
# Добавляем в нее записи
table_src.insert(Feature({'id': '1', 'name': 'Name1'}))
table_src.insert(Feature({'id': '2', 'name': 'Name2'}))
# Создаем целевую таблицу и производим экспорт
destination = provider_manager.csv.get_destination('outfile.csv', Schema())
destination.export_from_table(table_src, copy_schema=True)
Рассмотрим экспорт таблицы в базу данных на примере.
# откроем исходный файл
src = provider_manager.openfile('points.tab')
# Обозначим дополнительные параметры при экспорте. В данном случае это явное пересоздание таблицы
# и сохранение результатов в лог файле. Данный параметр можно опустить.
exportParams = ExportParameters()
exportParams.logFile = 'export.log'
exportParams.dropTable = True
# Наименование таблицы в БД
newTableName = 'points_db'
# Определяем источник куда будем производить экспорт
dest = provider_manager.postgre.get_destination(host='db_server_addr',
db_name='test',
dataobject=newTableName,
user='user',
password='pass',
export_params = exportParams,
schema = src.schema)
# Непосредственно производим экспорт
dest.export_from_table(src)
Импорт
Источник данных axipy.Source
- это зеркальный тип назначения
объекта данных axipy.Destination
. Так же как для назначения,
некоторые типы данных поддерживают только импорт, и не могут быть напрямую
открыты с помощью axipy.Source.open
. А другие типы поддерживают
и открытие и импорт для случаев, когда открытие и редактирование не требуется.
source = provider_manager.tab.get_source(input_tab_file)
destination.export_from(source)
См.также
Чтобы узнать, какие типы поддерживают импорт и экспорт, обратитесь к
описанию конкретных провайдеров данных axipy.ProviderManager
.
Изменение структуры таблицы
Если необходимо изменить структуру таблицы, в частности добавить новое поле, удалить существующее или же его расширить. Эту процедуру можно выполнить через экспорт. Рассмотрим на примере.
Откроем исходную таблицу
# открываем исходный файл
src = provider_manager.openfile(src_filepath)
Далее, возьмем схему исходной таблицы, сделаем ее копию и произведем все необходимые с ней изменения. Т.е. добавим новое поле в конкретную позицию, удалим ненужное и расширим длину существующего.
# Целевая схема как копия исходной
dest_schema = src.schema
# вставка нового поля
dest_schema.insert(2, Attribute.string('Новое поле', 30))
# Удаление поля по имени
attr_to_del = dest_schema.by_name('Capital')
dest_schema.remove(attr_to_del)
# Увеличение длины поля
idx_edit = dest_schema.index_by_name('Страна')
dest_schema[idx_edit] = Attribute.string('Страна', 100)
Следующим шагом создаем выходную таблицу на базе полученной схемы и производим непосредственно экспорт.
# Создаем таблицу
dest = provider_manager.tab.get_destination(dest_filepath, dest_schema)
# Экспортируем данные
dest.export_from_table(src)
Если необходимо создать таблицу в памяти на базе измененной структуры, то эту задачу можно выполнить следующим образом:
# Создаем таблицу в памяти на базе измененной схемы
memory_table = provider_manager.create({'schema': dest_schema})
# Производим вставку данных
memory_table.insert(src.items())