class User(Base):
__tablename__ = 'users'
__table_args__ = (saschema.UniqueConstraint("login", "company_id"), {})
__mapper_args__ = {
'order_by' : 'lower(users.name)',
}
user_id = Column(Integer, primary_key=True)
email = Column(String)
login = Column(String)
company_id = Column(String, ForeignKey('company.company_id'))
def do_update(user_id):
existing = Session().query(User).filter_by(user_id=user_id).one()
for field in ('login', 'email', 'name', 'is_admin_user'): # only email changes; it's set to "" from "foo@bar.com"
if field in params:
setattr(existing, field, params[field])
if 'advanis_portal_user_id' in params:
if not existing.portal_link:
existing.portal_link = UserPortalLink()
existing.portal_link.advanis_portal_user_id = params['advanis_portal_user_id']
if 'password' in params and existing.password:
existing.password.password = Password.encrypt(existing.login, params['password'])
UserValidator(existing) # raises an exception
self._commit()
return existing
Session().query(User).filter_by(login=login, company_id=company).one()
Session().query(User).all()
Session().query(User).filter_by(user_id=user_id).one()
问题的原因是当电子邮件字段被设置为 “” 时,SQLAlchemy ORM 不会将该更改持久化到数据库中。这可能是由于在设置电子邮件字段为空字符串之前没有调用 session.flush()
方法造成的。调用 session.flush()
方法可以将未提交的更改写入到数据库中,从而确保当对数据库发出查询时可以获取到最新的数据。
为了解决这个问题,需要在代码中调用 session.flush()
方法,如下所示:
def do_update(user_id):
existing = Session().query(User).filter_by(user_id=user_id).one()
for field in ('login', 'email', 'name', 'is_admin_user'): # only email changes; it's set to "" from "foo@bar.com"
if field in params:
setattr(existing, field, params[field])
if 'advanis_portal_user_id' in params:
if not existing.portal_link:
existing.portal_link = UserPortalLink()
existing.portal_link.advanis_portal_user_id = params['advanis_portal_user_id']
if 'password' in params and existing.password:
existing.password.password = Password.encrypt(existing.login, params['password'])
UserValidator(existing) # raises an exception
# Add this line to flush the changes to the database
session.flush()
self._commit()
return existing
调用 session.flush()
方法后,当对数据库发出查询时,就可以获取到最新的数据了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。