LINUX.ORG.RU

sqlalchemy как обновить таблицу

 ,


0

1

Имеется DB модель и DTO к ней. После выполнения выборки из БД в виде списка DTO, с элементами списка выполняется работа — поля обновляются и нужно подключиться к БД и обновить строки таблицы, соответсвующие DTO-шкам.

Как это сделать? застрял опять

@dataclass
class MyData1:
    name: str
    id: int = None
    @classmethod
    def fromMyTable1(cls, elem):
        return cls(id=elem.id, name=elem.name)

    @classmethod
    def toMyTable1(cls, elem):
        return MyTable1(id=elem.id, name=elem.name)

class MyTable1(Base):

    __tablename__ = 'MyTable1'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)


def getAll() -> List[MyData1]:
    result = []
    with sessionScope() as session:
        rows = session.query(MyTable1).all()
        for row in rows:
            result.append(MyData1.fromMyTable1(row))
    return result

def insertAll(datas: List[MyData1]):
    with sessionScope() as session:
        for data in datas:
            row = MyData1.toMyTable1(data)
            print(row.id, row.name)
            # HOW TO UPDATE  ???

P.S. Нужно разделить выборку данных и обновление, и делать это не в рамках одной сессии. Т.е. я выбрал данные, поработал и потом сохранил:

myDatas = getAll()
for data in myDatas:
    data.name = 'my_{}'.format(data.name)
insertAll(myDatas)

P.S.2 почемуто не элегантным мне кажеться такое решение

def insertAll(datas: List[MyData1]):
    with sessionScope() as session:
        for data in datas:
            row = MyData1.toMyTable1(data)
            rows = session.query(MyTable1).filter(MyTable1.id==row.id) \
                          .update({'name': row.name})
как всегда, сам не знаю, но что-то не устраивает ))) может можно не перебирать все поля?

По-моему, ты делаешь какую-то дичь.

Приведи какой-то реальный пример. data.name = 'my_{}'.format(data.name) — это можно одним апдейтом сразу на все нужные строки сделать без тупняка с выгрузкой, перебором и обновлением по-одному.

Почему спрашиваю? Я практически уверен, что такого примера не найдётся.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Я отделяю репозиторные методы от расчетов. Решился запилить эту дичь.

  1. Код работы с БД лежит отдельно, расчеты отдельно.

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

scientistpython ()
Ответ на: комментарий от scientistpython

хотя походу перемудрил я, здесь же с выборо sqlalchemy уже дан ORM и какбы мешать его с REpository == захломлять проект )))

scientistpython ()
Ответ на: комментарий от scientistpython

отделяю репозиторные методы от расчетов

Забудь про эту ахинею. То, что ты делаешь уже скорее на ETL похоже. А это совсем не так делается.

WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

Да, я делаю скорее ETL, с Pandas на борту. Не подскажешь чего почитать в плане разработки на Python? Интересуют паттерны, архитектура.

scientistpython ()
Ответ на: комментарий от scientistpython

По ETL ничего посоветовать не могу, а по питону на docs.python.org инфа исчерпывающая, никаких дополнительных материалов не требуется.

WitcherGeralt ★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.