SQLAlchemy过滤器始终返回false

时间:2013-01-18 21:00:45

标签: python orm sqlalchemy

我有一个简单的玩家实体:

__tablename__ = 'player'

_id = Column('id', SmallInteger, primary_key=True)
_nickName = Column('nick_name', String)

def __init__(self, nickName):
    self._nickName = nickName

@property
def id(self):
    return self._id

@property
def nickName(self):
    return self._nickName.decode(encoding='UTF-8')

@nickName.setter
def nickName(self, nickName):
    self._nickName = nickName

当我这样做时:

players = session.query(Player).filter(Player.nickName=='foo')

我打印players var我得到了这个:

SELECT player.id AS player_id, player.nick_name AS player_nick_name
FROM player
WHERE false

显然,当我在会话查询结束时添加.first()时,结果为None。 我尝试使用filter_by()并得到相同的结果。

欢迎任何帮助。

2 个答案:

答案 0 :(得分:2)

您不能将常规@property用作查询参数。改为使用@hybrid_property

from sqlalchemy.ext.hybrid import hybrid_property

@hybrid_property
def nickName(self):
    return self._nickName.decode(encoding='UTF-8')

@nickName.setter
def nickName(self, nickName):
    self._nickName = nickName

这使得Player.nickName(在类的属性上也是如此)在SQL表达式中很有用。

答案 1 :(得分:2)

虽然在一般情况下使用@hybrid_property 修复此问题,但您根本不需要手动解码。只需将列类型设置为Unicode而不是String,并假设您的服务器运行良好,您应该正确地返回unicode

您根本不需要id属性。

所以这个课程你需要的是:

class Player(Base):
    __tablename__ = 'player'

    id = Column(SmallInteger, primary_key=True)
    nickName = Column(Unicode)

(列名和__init__参数都可以自动生成。)

如果您的数据库没有正确处理Unicode,那么这就是我们希望帮助您修复的另一个问题。 :)