我不知道如何在SQLAlchemy的查询表达式语法中使用诸如substr(X, Y, Z)之类的SQLite函数。我知道我可以使用原始查询,但这会使重用where子句更加困难。下面是我的用例:
我有一个表(或模型类)的文件头,我查询它来标识和列出某些类型的文件。在class Blob(Base):
__tablename__ = 'blob'
_id = Column('_id', INTEGER, primary_key=True)
size = Column('size', INTEGER)
hash = Column('hash', TEXT)
header = Column('header', BLOB)
meta = Column('meta', BLOB)
例如,要标识Exif映像,可以使用以下原始查询:
^{pr2}$
X'45786966'只是ASCII编码的字符串Exif的SQLiteBLOB文本。实际上,where子句更复杂,我想重用它们作为连接的过滤条件,大致如下所示:# define once at module level
exif_conditions = [functions.substr(Blob.header, 7, 4) == b'Exif']
# reuse for arbitrary queries
session.query(Blob.hash).filter(*exif_conditions)
session.query(...).join(...).options(...).filter(condition, *exif_conditions)
有没有一种方法可以用SQLAlchemy实现这一点?在