如何在 SQLAlchemy ORM 中过滤给定字符串长度的列?
How do I filter a column for a given string length in SQLAlchemy ORM?
编辑:已解决
我正在尝试实现一个相当简单的 SQL 查询,该查询 returns 仅包含长度小于 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 正确过滤字符串长度?
原来是我的错误,我只是使用了错误的列名作为 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>
乍一看似乎有道理。
编辑:已解决
我正在尝试实现一个相当简单的 SQL 查询,该查询 returns 仅包含长度小于 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 正确过滤字符串长度?
原来是我的错误,我只是使用了错误的列名作为 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>
乍一看似乎有道理。