在 SQLAlchemy 查询中使用 SQL 函数,例如 substr(X, Y, Z)
Use SQL functions like substr(X, Y, Z) in SQLAlchemy query
我不知道如何将 SQLite 的函数(如 substr(X, Y, Z))与 SQLAlchemy 的查询表达式语法一起使用。我知道我可以使用原始查询,但这会使重用我的 where 子句变得更加困难。这是我的用例:
我有一个 table(或模型 class)文件头,我查询它以识别和列出某些类型的文件。
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 图像,我可以使用这个原始查询:
select * from blob where substr(header,7,4) = X'45786966'
X'45786966'
只是用 ASCII 编码的字符串 Exif
的 SQLite BLOB
文字。实际上,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 实现这个?
好的。这太简单了。
from sqlalchemy.sql import func
exif_conditions = [func.substr(Blob.header, 7, 4) == b'Exif']
我不知道如何将 SQLite 的函数(如 substr(X, Y, Z))与 SQLAlchemy 的查询表达式语法一起使用。我知道我可以使用原始查询,但这会使重用我的 where 子句变得更加困难。这是我的用例:
我有一个 table(或模型 class)文件头,我查询它以识别和列出某些类型的文件。
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 图像,我可以使用这个原始查询:
select * from blob where substr(header,7,4) = X'45786966'
X'45786966'
只是用 ASCII 编码的字符串 Exif
的 SQLite BLOB
文字。实际上,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 实现这个?
好的。这太简单了。
from sqlalchemy.sql import func
exif_conditions = [func.substr(Blob.header, 7, 4) == b'Exif']