Почему мои данные не отображаются должным образом в моей модели SQLAchemy? - PullRequest
2 голосов
/ 20 сентября 2010

У меня есть специфическая проблема SQLAlchemy ORM. Это происходит в приложении Pylons против базы данных Postgresql 8.2, использующей psycopg2 в качестве драйвера моей базы данных под SQLAlchemy 0.6.0 (а также с 0.6.4)

Я определил объект модели User, который имеет (как минимум) следующие свойства:

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

Обратите внимание на два комментария; они описывают последовательность событий. Особенно это исключение, которое вызывается перед коммитом.

Я беру User, чье поле электронной почты установлено в «user@example.com», и устанавливает его в «», что приводит к тому, что валидатор вызывает исключение. После этого, даже после перезапуска сервера 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'chris.rose@advanis.ca', u'offby1', False)
[sqlalchemy.engine.base.Engine] Row (3, u'crose', u'Chris Rose', u'chris.rose@advanis.ca', u'offby1', True)

Обратите внимание, что адрес электронной почты возвращается. Этот объект закодирован как JSON и отправлен по проводам, и к этому времени свойство электронной почты будет равно ''

Этот запрос возвращает полного пользователя с адресом электронной почты (обратите внимание, что это все тот же объект!):

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'chris.rose@advanis.ca', u'offby1', True)

Для этого запроса я верну правильный адрес электронной почты пользователя.

Что здесь происходит, и как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Это удар в темноте, но попробуйте использовать Session.commit() вместо self._commit().

0 голосов
/ 21 сентября 2010

Я не знаком с пилонами, но ваш возврат из базы данных кажется нормальным (поскольку столбец электронной почты не пустой).Есть ли какое-то кеширование с пилонами?

...