Запрос вложенных столбцов PyTables

У меня есть таблица с вложенным столбцом таблицы, route. Ниже находятся два других вложенных типа данных, главный и подчиненный, которые оба имеют целочисленный идентификатор и поле строкового типа.

Я хотел бы запустить что-то вроде table.readWhere('route/master/id==0'), но получаю "переменная route ссылается на вложенный столбец, что не разрешено в условиях"

Есть ли способ запросить вложенный тип данных в pytables?


person musingsole    schedule 26.03.2013    source источник


Ответы (2)


Вы должны создать переменные, которые будут использоваться внутри строки условия. Один из вариантов — определить словарь переменных:

table.readWhere('rId==0', condvars={'rId': table.cols.route.master.id})

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

rId = table.cols.route.master.id
table.readWhere('rId==0')

Поскольку это загрязняет пространство имен, я рекомендую вам создать функцию для переноса кода. Я попытался сослаться на сам столбец, но кажется, что интерпретатор извлекает весь набор данных, прежде чем выдать ошибку NameError.

table.readWhere('table.cols.route.master.id==0') # DOES NOT WORK

Дополнительные сведения о методе where() см. в справочнике по библиотеке.

person streeto    schedule 31.05.2013

Основываясь на ответе streeto, вот быстрый способ получить доступ ко всем вложенным столбцам в таблице при создании запрос

condvars = {k.replace('/', '__'): v for k, v in table.colinstances.items()}
result = table.read_where('route__master__id == 0', condvars=condvars)

table.colinstances возвращает плоский словарь, ключи которого — разделенные косой чертой пути ко всем столбцам (включая вложенные) в таблице, а значения — экземпляры класса PyTables Col, расположенные по этому пути. Вы не можете использовать в запросе путь, разделенный косой чертой, но если вы замените его каким-либо другим разделителем, разрешенным в идентификаторах Python (в данном случае я выбрал двойное подчеркивание), тогда все будет работать нормально. Вы можете выбрать другой разделитель, если хотите.

person Mr. Frobenius    schedule 20.06.2018