sqlalchemy обновить определенный конкретный элемент столбца, где значение? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть sqlite db, созданный как показано ниже:

class VPN_routers(Base):
    __tablename__ = 'vpnrouters'
    __table_args__ = TABLE_ARGS
    sp_id = Column(String(), primary_key=True)
    router_id = Column(String())
    external_gw = Column(String())
    subnet_attached = Column(String())
    vpn_connectivity = Column(String()

, а содержимое таблицы выглядит следующим образом:

sp-10.1.10.148|66c49f9b-11c4-4|172.24.4.6|cb3a722e-2ec4-4caf-a34b-93004d885f28|NO
sp-10.1.10.147|282608ba-8870-l|172.24.4.7|Not Attached|NO
sp-10.1.10.149|44cc77fe-3b2e-4|172.24.4.7|50853e0b-918f-4c5f-8188-3acbb23a829a|NO

Я хотел обновить строку, где sp_id =«sp-10.1.10.147» (идентификация с использованием sp_id) и обновить subnet_id и vpn_connectivity до новых значений.после обновления таблица может выглядеть следующим образом.

sp-10.1.10.148|66c49f9b-11c4-4|172.24.4.6|cb3a722e-2ec4-4caf-a34b-93004d885f28|NO
sp-10.1.10.147|282608ba-8870-l|172.24.4.7|cbcbeiowj-d34f5tgygt-6g7ggrydwqrer3d|YES
sp-10.1.10.149|44cc77fe-3b2e-4|172.24.4.7|50853e0b-918f-4c5f-8188-3acbb23a829a|NO

Я пытаюсь написать это обновление как функцию, в которой я могу иметь возможность присвоить кому-либо значение в качестве идентификатора (не обязательно sp_id всегда) строкии соответствующие ему столбцы новые элементы в качестве входных данных для функции.

ex:

update_DB(VPN_routers, identifier={'sp_id':"sp-10.1.10.147"}, changes={'subnet_attached': "cbcbeiowj-d34f5tgygt-6g7ggrydwqrer3d", 'vpn_connectivity':"YES"})

* Примечание: идентификатор и изменения не всегда одинаковы, идентификатор будет иметь фиксированную длину 1, ноизменения могут иметь переменную длину.

Я перепробовал много методов, но я не мог сделать это, полностью полагаясь на этот пост для ответа.

1 Ответ

0 голосов
/ 25 мая 2018

«Идентификатор» прост в обращении: просто используйте Query.filter_by() и , чтобы распаковать данный словарь в качестве аргументов ключевого слова .

, начиная с Query.update() принимает словарь с именами атрибутов в качестве ключей, обработка изменений так же проста, как передача словаря вперед:

def update_DB(cls, identifier, changes):
    session.query(cls).\
        filter_by(**identifier).\
        update(changes, synchronize_session=False)

Пока оба словаря используют имена атрибутов в качестве ключей, это будет работать,но ваш пример включает в себя «subnet_id» в качестве ключа, который не является атрибутом сопоставленного класса.Возможно, это должно было быть "subnet_attached".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...