【问题标题】:SQLAlchemy filter always returns falseSQLAlchemy 过滤器总是返回 false
【发布时间】:2013-01-18 21:00:44
【问题描述】:

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

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

欢迎任何帮助。

【问题讨论】:

  • 请问您为什么要创建属性而不是直接使用列?
  • 如果确实需要使用属性,请查看synonymsynonym_forhybrid扩展名。
  • @Audrius 因为这是我发现的解决编码问题的最简单方法。如果您对此有想法,我会删除 getter/setter(我在 Windows 上)。编辑:Eevve 回答修复此问题

标签: python orm sqlalchemy


【解决方案1】:

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

您也根本不需要id 属性。

所以你应该只需要:

class Player(Base):
    __tablename__ = 'player'

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

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

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

【讨论】:

  • 这非常有效(Unicode@hybrid_property)。谢谢。我手动指定了列名,因为该字段被命名为nick_name 和“属性”nickName。对于__init__ 部分,这意味着我不需要定义这个方法来获得我当前__init__ 的行为?
  • Python 变量和方法通常命名为with_underscores,那么为什么不直接命名为nick_name?是的,声明性扩展将为您生成一个带有关键字参数的__init__,因此您可以说Player(nick_name=u'martinqt')
  • 那是因为我是 python 新手,但是我学过 C++ 和 PHP,所以我觉得我还有一些旧习惯。感谢您的建议,我会在下一个项目中尝试这样做。
【解决方案2】:

您不能使用常规的@propertys 作为查询参数。请改用@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 表达式中很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    相关资源
    最近更新 更多