SQLAlchemy обновляет значение в строке динамически после filter_by - PullRequest
0 голосов
/ 31 августа 2018

Я новичок в Python и SQLAlchemy. Я на python 3

Я создал класс testtbl для работы с таблицами. Одна функция - это update, где я передаю:

myfilter = {'origin_source_id':'MX01’}.

найдите эту строку в таблице mysql, где origin_source_id = ‘MX01'

updatevalue = {'origin_source_id':'CAL01’}

заменить найденный origin_source_id на ‘CAL01;

Звонок

testtbl.update_row(myfilter,updatevalue)

Функция

def update_row(self,locaterowfilter,updatevalue):
    self.Session.query( self.TableClass ).filter_by( **locaterowfilter ).update( updatevalue )

Я получаю следующую ошибку

target_cls = query._mapper_zero().class_ 
AttributeError: 'NoneType' object has no attribute ‘class_’

Понятия не имею, как с этим бороться.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 31 августа 2018

Ошибка является результатом передачи объекта Table в качестве основного объекта запроса и попытки использовать Query.update():

In [26]: t = Table('t', metadata,
    ...:           Column('a', Integer))

In [27]: session.query(t).update({'a': 1})
...
.../python3.6/site-packages/sqlalchemy/orm/persistence.py in _do_pre_synchronize(self)
   1383     def _do_pre_synchronize(self):
   1384         query = self.query
-> 1385         target_cls = query._mapper_zero().class_
   1386 
   1387         try:

AttributeError: 'NoneType' object has no attribute 'class_'

, что означает, что ваш self.TableClass не является сопоставленным классом . Если вы хотите обновлять Table, используйте конструкции Core update():

stmt = self.TableClass.update().\
    where(and_(*[self.TableClass.c[key] == value
                 for key, value in locaterowfilter.items()])).\
    values(updatevalue)
self.Session.execute(stmt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...