Python用覆盖更新DB列问题?

时间:2017-09-22 09:43:41

标签: python database

我有一个简单的函数,应该为某些用户更新某个列:

for key, group in groupby(list_i):
    print key, type(key), len(list(group)), type(len(list(group)))
    setattr(User.query.filter_by(id=key).first(), "number_of_rooms", len(list(group)))
db_session.commit()

我有一个包含数据的列表(list_i),只需查看print:

enter image description here

数据是正确的,第一个数字是用户的ID,第二个是应该分配给number_of_rooms列的值

问题是它将用户的所有值设置为0。我认为它不知何故是最后一个用户的覆盖问题,我不知道。问题是如果我把它改为:

setattr(User.query.filter_by(id=key).first(), "number_of_rooms", 2)

对于2的所有用户,它会将值更改为id=key,以便该功能正常运行。我在这里非常困惑,因为len(list(group))是一个简单的整数,它应该可以工作。

修改

我仔细检查了所有内容,我还使用变量(t)进行了另一项测试,增加1并添加了一个onther打印来检查所有内容,变量也可以使用,这怎么可能?< / p>

t = 0
for key, group in groupby(list_i):
    print key, type(key), len(list(group)), type(len(list(group)))
    my_user = User.query.filter_by(id=key).first()
    setattr(my_user, "number_of_rooms", t)
    print my_user.number_of_rooms
    t+=1
db_session.commit()

number_of_rooms的值更改:

enter image description here

EDIT + SOLUTION + STILL CONFUSED

我设法解决了这个问题,但我不会回答这个问题,因为我不明白为什么它修复它并且我从来没有遇到类似的东西,只是改变了打印的位置和改变数据的代码修复了它但是数据很多已正确更改print现在为0。

我唯一的猜测是len(list(group))只能在此功能中使用一次,但为什么呢?或者它在某种程度上是一个线程问题,老实说,我很困惑。如果有人可以解释这一点,我会很高兴。

以下是解决问题的代码:

for key, group in groupby(list_i):
    my_user = User.query.filter_by(id=key).first()
    setattr(my_user, "number_of_rooms", len(list(group)))
    print key, type(key), len(list(group)), type(len(list(group)))
db_session.commit()

setattr之后的打印:

enter image description here

0 个答案:

没有答案