我有一个简单的玩家实体:
__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()
并得到相同的结果。
欢迎任何帮助。
答案 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,那么这就是我们希望帮助您修复的另一个问题。 :)