为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 SQLAlchemy ORM 中过滤给定字符串长度的列?

如何在 SQLAlchemy ORM 中过滤给定字符串长度的列?

当年话下 2023-03-16 09:16:39
我正在尝试实现一个相当简单的 SQL 查询,该查询仅返回包含长度小于 17 个字符的字符串(SQLite3 中的文本类型)的行。这是计划 SQL 中的查询:SELECT * FROM table WHERE length(col) < 17我尝试通过使用以下语句来获取它:result = session.query(Table).filter(func.length(Table.col) < 17).all()SQLAlchemy 将其正确翻译为 [SQL: SELECT table.col AS table_col FROM table WHERE length(?) < ?] 问题出在它为问号插入的值。即它取代了第二个?17 就好了,但是 Table.column 不是获取实际长度,而是获取代表该列的对象。 [parameters: (<property object at 0x00000226998E3590>, 17)]. 这导致我收到错误 sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type.。那么如何使用 SQLAlchemy ORM 正确过滤字符串长度呢?
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

原来错误都是我的,我只是使用了错误的列名作为 func.length 的参数。例如,这就是模型的样子

class Table(Base):
    __tablename__ = 'table'
    __table_args__ = {'autoload': True}
    aliased_col = Column('col', Text, nullable=False)

我试图这样查询

result = session.query(Table).filter(func.length(Table.col) < 17).all()

显然我应该这样做

result = session.query(Table).filter(func.length(Table.aliased_col) < 17).all()

效果很好。我让自己感到困惑,因为错误消息将我指向<property object at 0x00000226998E3590>乍一看似乎合理的属性。


查看完整回答
反对 回复 2023-03-16
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信