SQLAlchemy在filter_by之后动态更新一行中的值

时间:2018-08-30 21:25:08

标签: python sqlalchemy

我是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 :(得分:1)

该错误是由于将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不是mapped class。如果您希望在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)