# Открытие/Создание

Открытие и создание объектов данных `axipy.DataObject` выполняется провайдерами данных. Класс `axipy.ProviderManager` представляет коллекцию зарегистрированных провайдеров данных.

## Открытие

Самый простой способ открыть объект данных из файла - использовать функцию `axipy.ProviderManager.openfile`. Функция сама найдет подходящий провайдер данных для открытия.

Совет

Это предпочтительный способ.

Пример открытия

    # filepath = 'path/to/file.tab'
    table = provider_manager.openfile(filepath)

Примечание

При открытии данных они попадают в единый каталог `axipy.DataManager`.

При необходимости указать больше параметров для открытия, или если параметры по умолчанию не подходят, можно явно использовать провайдер данных. Необходимый провайдер данных можно получить из коллекции зарегистрированных провайдеров данных `axipy.ProviderManager`.

Пример открытия конкретным провайдером

    # csv_filepath = 'path/to/file.csv'
    csv_table = provider_manager.csv.open(csv_filepath, delimiter='\t')

Самый сложный способ - открытие через словарь `dict`. Здесь нужно заранее знать все параметры, их допустимые значения и идентификатор провайдера данных.

Пример открытия из словаря

    """
    Открывает csv файл через определение ``definition``.
    Исключительно в качестве примера. Открывать csv проще провайдером.
    """
    # csv_filepath = 'path/to/file.csv'
    definition = {
        'src': csv_filepath,
        'delimiter': '\t',
        'charset': 'utf8',
        'hasNamesRow': True,
        'provider': 'CsvDataProvider'
    }
    csv_table = provider_manager.open(definition)

При открытии таблиц из СУБД задаются как параметры подключения, так и требуемая таблица или текст запроса.

Пример открытия данный из БД Postgres с указанием имени таблицы.

    definition = provider_manager.postgre.get_source(
        host='192.168.0.2',
        db_name='test',
        user='test',
        password='pass',
        dataobject='world'
    )
    table = provider_manager.open(definition)

Пример открытия данный из БД oracle с указанием текста SQL запроса.

    definition = provider_manager.oracle.get_source(
        host='192.168.0.2',
        db_name='ORCL',
        user='test',
        password='pass',
        sql='select * from world'
    )
    table = provider_manager.open(definition)

Если источник содержит в себе несколько объектов данных, то этот список можно получить посредством метода `axipy.ProviderManager.read_contents()`:

    # Запросим перечень таблиц
    definition = {'src':'sample.gpkg'}
    print(provider_manager.read_contents(definition))
    >>> ['table1', 'table2', 'table3']

Далее подставляем имя нужной таблицы и открываем объект данных.

    # Откроем нужную таблицу
    definition = {'src':'sample.gpkg', 'dataobject':'table1'}
    table = provider_manager.open(definition)

## Создание

Аналогично, самый простой способ создания файлов - с помощью функции `axipy.ProviderManager.createfile`:

Пример создания

    # filepath = 'path/to/file.tab'
    schema = Schema(
        Attribute.string('country', 30),
        Attribute.string('capital', 30),
        coordsystem='prj:Earth Projection 1, 104'
    )
    table = provider_manager.createfile(filepath, schema)

Примечание

При создании объекта данных он автоматически открывается.

Для задания дополнительных параметров или использования специализированных возможностей провайдера данных, можно явно вызывать методы конкретного провайдера.

Пример создания конкретным провайдером

    schema = Schema(
        Attribute.string('country', 30),
        Attribute.string('capital', 30),
    )
    temp_table = provider_manager.shp.open_temporary(schema)

Если и этот способ не подходит для решения какой-то задачи, можно создавать объекты данных из словаря. Это самый сложный и непрактичный способ.