Я знаю, что всегда предпочтительнее не кодировать пароль sudo в скрипте. Однако по какой-то причине, если у вас нет разрешения на изменение /etc/sudoers
или смену владельца файла, Pexpect является реальной альтернативой.
Вот функция Python sudo_exec
для вашей справки:
import platform, os, logging
import subprocess, pexpect
log = logging.getLogger(__name__)
def sudo_exec(cmdline, passwd):
osname = platform.system()
if osname == 'Linux':
prompt = r'\[sudo\] password for %s: ' % os.environ['USER']
elif osname == 'Darwin':
prompt = 'Password:'
else:
assert False, osname
child = pexpect.spawn(cmdline)
idx = child.expect([prompt, pexpect.EOF], 3)
if idx == 0: # if prompted for the sudo password
log.debug('sudo password was asked.')
child.sendline(passwd)
child.expect(pexpect.EOF)
return child.before
Квассной сказал:
Вы должны использовать либо вложенные наборы, либо модели родитель-потомок.
Я использовал их для реализации обоих. Что я могу сказать:
Используйте архитектуру вложенных наборов, если ваша таблица категорий не меняется часто, потому что в предложении select это быстро и с помощью всего одного запроса вы можете получить всю ветвь иерархии для данной записи. Но в предложении вставки или обновления требуется больше времени, чем у родительской дочерней модели для обновления левого и правого (или нижнего и верхнего в приведенном ниже примере) полей.
Другой момент, довольно тривиальный, я должен признать, но:
Изменить иерархию вручную прямо в базе данных очень сложно (это могло произойти во время разработки). Итак, не забудьте сначала реализовать интерфейс для игры с вложенным набором (изменение родительского узла, перемещение узла ветви, удаление узла или всей ветви и т. Д.)
Вот две статьи на эту тему:
И последнее, я не пробовал, но где-то читал, что во вложенной таблице множеств может быть более одного дерева, я имею в виду несколько корней.
Создайте таблицу категорий со следующими полями:
Ваш ParentID затем будет ссылаться на в CategoryID его родительского элемента.
Пример:
CategoryID CategoryName ParentID
---------------------------------
1 Dog NULL
2 Cat NULL
3 Poodle 1
4 Dachsund 1
5 Persian 2
6 Toy Poodle 3
Из примера в вашем вопросе похоже, что вы хотите, чтобы у данной категории было несколько родителей (например, «Видео MIT -> Программирование видео 1», а также «Видео -> Программирование видео 1»), и в этом случае простого добавления столбца ParentID будет недостаточно.
Я бы рекомендовал создать две таблицы: простую таблицу категорий со столбцами CategoryID и CategoryName и отдельную таблицу CategoryRelationships с ParentCategoryID и столбцы ChildCategoryID. Таким образом, вы можете указать столько родительско-дочерних отношений, сколько хотите для любой конкретной категории. Можно даже использовать эту модель для создания двойных отношений, когда две категории одновременно являются родительскими и дочерними друг для друга. (С головы до ног, я могу ''
Вы должны использовать либо вложенные наборы
, либо модели родитель-потомок
.
Родитель-потомок
:
typeid parent name 1 0 Buyers 2 0 Sellers 3 0 Referee 4 1 Electrical 5 1 Mechanic
SELECT *
FROM mytable
WHERE group IN
(
SELECT typeid
FROM group_types
START WITH
typeid = 1
CONNECT BY
parent = PRIOR typeid
)
выберет все покупателей в Oracle
.
Вложенные наборы
:
typeid lower upper Name 1 1 2 Buyers 2 3 3 Sellers 3 4 4 Referee 4 1 1 Electrical 5 2 2 Mechanic
SELECT *
FROM group_types
JOIN mytable
ON group BETWEEN lower AND upper
WHERE typeid = 1
выберут всех покупателей в любой базе данных.
См. этот ответ для более подробной информации.
Вложенные sets
проще запросить, но сложнее обновить и сложнее построить древовидную структуру.
Что вам нужно, так это базовые отношения родитель-потомок:
Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))
Лучший способ сохранить parent_id таблицы - это вложить его в ID например,
100000 Программирование 110000 C Язык 111000 Видео 1 Программирование 111100 C Язык 111110 Stanford Video
и т. Д., Так что все, что вам нужно, это сценарий для обработки идентификатора, чтобы первая цифра представляла категорию верхнего уровня и так далее по мере продвижения вниз по иерархии