2010-09-20 64 views
2

我有一個奇怪的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) 

對於此查詢,我得到了正確的用戶電子郵件地址回來。

這裏發生了什麼,我該如何解決?

+0

什麼是你的問題?第一個查詢和JSON輸出之間的電子郵件地址丟失了?或者這個特殊的地址不應該在那裏? – knitti 2010-09-20 20:02:26

+0

在從數據庫返回的查詢結果和訪問user.email屬性之間,地址消失。 – 2010-09-20 21:07:38

回答

0

我不熟悉塔,但你的數據庫返回似乎沒問題(因爲電子郵件列不是空的)。有沒有使用掛架進行某種緩存?

0

這是在黑暗中刺,但嘗試使用Session.commit()而不是self._commit()

相關問題