4

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

__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()并得到相同的结果。

欢迎任何帮助。

4

2 回答 2

2

您不能使用正则@propertys 作为查询参数。使用 a@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 表达式中很有用。

于 2013-01-18T21:46:54.903 回答
2

虽然 using@hybrid_property 在一般情况下解决此问题,但您根本不需要手动解码。只需将列类型设置为UnicodeString并且假设您的服务器运行良好,您应该正确地返回一个unicode.

您也根本不需要该id属性。

所以这门课你只需要:

class Player(Base):
    __tablename__ = 'player'

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

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

如果由于某种原因您的数据库无法正确处理 Unicode,那么这是一个不同的问题,我们很乐意帮助您解决。:)

于 2013-01-18T21:54:03.270 回答