我有一个奇怪的SQLAlchemy ORM问题。这发生在一个Pylons应用程序中,针对使用psycopg2作为SQLAlchemy 0.6.0下的数据库驱动程序的Postgresql 8.2数据库(并试用0.6.4)为什么我的数据没有在我的SQLAchemy模型中正确表示?
我已经定义了一个用户模型对象, )以下属性:
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 "[email protected]"
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
注意的两点意见;他们描述事件的顺序。特别是,在之前提交的异常是。
我在做的是将User
的电子邮件字段设置为'[email protected]'并将其设置为'',这会导致验证器发出异常。在此之后,即使在重新启动Pylons服务器之后,以下查询返回的用户也有''作为电子邮件地址!这两个查询返回用户与“”电子邮件地址:
Session().query(User).filter_by(login=login, company_id=company).one()
Session().query(User).all()
下面是这两个查询的第一个SQL /参数/响应:
[sqlalchemy.engine.base.Engine] BEGIN
[sqlalchemy.engine.base.Engine] SELECT users.user_id AS users_user_id, users.login AS users_login, users.name AS users_name, users.email AS users_email, users.company_id AS users_company_id, users.is_admin_user AS users_is_admin_user
FROM users
WHERE %(param_1)s = users.company_id ORDER BY lower(users.name)
[sqlalchemy.engine.base.Engine] {'param_1': u'offby1'}
[sqlalchemy.engine.base.Engine] Col ('users_user_id', 'users_login', 'users_name', 'users_email', 'users_company_id', 'users_is_admin_user')
[sqlalchemy.engine.base.Engine] Row (8, u'newuser', u'A new user', u'[email protected]', u'offby1', False)
[sqlalchemy.engine.base.Engine] Row (3, u'crose', u'Chris Rose', u'[email protected]', u'offby1', True)
注意返回的电子邮件地址。这个对象编码为JSON并通过网络发送,并由当时的email属性是“”
该查询返回的电子邮件地址完整的用户(请注意,这是所有同一个对象!):
Session().query(User).filter_by(user_id=user_id).one()
下面是该查询的详细记录:
[sqlalchemy.engine.base.Engine] BEGIN
[sqlalchemy.engine.base.Engine] SELECT users.user_id AS users_user_id, users.login AS users_login, users.name AS users_name, users.email AS users_email, users.company_id AS users_company_id, users.is_admin_user AS users_is_admin_user
FROM users
WHERE users.user_id = %(user_id_1)s ORDER BY lower(users.name)
[sqlalchemy.engine.base.Engine] {'user_id_1': u'3'}
[sqlalchemy.engine.base.Engine] Col ('users_user_id', 'users_login', 'users_name', 'users_email', 'users_company_id', 'users_is_admin_user')
[sqlalchemy.engine.base.Engine] Row (3, u'crose', u'Chris Rose', u'[email protected]', u'offby1', True)
对于此查询,我得到了正确的用户电子邮件地址回来。
这里发生了什么,我该如何解决?
什么是你的问题?第一个查询和JSON输出之间的电子邮件地址丢失了?或者这个特殊的地址不应该在那里? – knitti 2010-09-20 20:02:26
在从数据库返回的查询结果和访问user.email属性之间,地址消失。 – 2010-09-20 21:07:38