Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的数据没有在SQLAchemy模型中正确表示?_Python_Orm_Sqlalchemy_Pylons - Fatal编程技术网

Python 为什么我的数据没有在SQLAchemy模型中正确表示?

Python 为什么我的数据没有在SQLAchemy模型中正确表示?,python,orm,sqlalchemy,pylons,Python,Orm,Sqlalchemy,Pylons,我有一个特殊的炼金术问题。这发生在Pylons应用程序中,针对Postgresql 8.2数据库,在SQLAlchemy 0.6.0下使用psycopg2作为我的数据库驱动程序,并在0.6.4中进行了尝试 我定义了一个用户模型对象,该对象至少具有以下属性: class User(Base): __tablename__ = 'users' __table_args__ = (saschema.UniqueConstraint("login", "company_id"), {}

我有一个特殊的炼金术问题。这发生在Pylons应用程序中,针对Postgresql 8.2数据库,在SQLAlchemy 0.6.0下使用psycopg2作为我的数据库驱动程序,并在0.6.4中进行了尝试

我定义了一个用户模型对象,该对象至少具有以下属性:

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
还有其他的,但我认为这些都是密切相关的

我正在使用以下代码在会话中编辑此实例它处理一些其他属性:

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@example.com'并将其设置为,这将导致验证器引发异常。在此之后,即使在重新启动Pylons服务器之后,通过以下查询返回的用户仍然需要一个电子邮件地址!这两个查询将返回电子邮件地址为的用户:

Session().query(User).filter_by(login=login, company_id=company).one()
Session().query(User).all()
以下是这两个查询中第一个查询的SQL/parameters/response:

[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)
对于这个查询,我得到了正确的用户电子邮件地址


这里发生了什么,我该如何修复它?

我不熟悉挂架,但您的数据库返回似乎没有问题,因为电子邮件列不是空的。是否对挂架进行了某种缓存?

我不熟悉挂架,但您的数据库返回似乎没有问题,因为电子邮件列不是空的。挂架是否存在某种缓存?

这是一种暗中操作,但请尝试使用Session.commit而不是self。\u commit。

这是一种暗中操作,但请尝试使用Session.commit而不是self。\u commit。

您有什么问题?在第一次查询和JSON输出之间,电子邮件地址丢失了吗?或者这个特定的地址不应该存在?从数据库返回的查询结果和访问user.email属性之间,这个地址消失了。你有什么问题?在第一次查询和JSON输出之间,电子邮件地址丢失了吗?或者这个特定的地址不应该存在?在从数据库返回的查询结果和访问user.email属性之间,地址消失了。