2016-08-04 20 views
0

Ich konnte nicht herausfinden, wie SQLite Funktionen wie substr(X, Y, Z) mit SQLAlchemy Query Ausdruck Syntax verwenden. Ich bin mir bewusst, dass ich rohe Abfragen verwenden könnte, aber das würde es schwieriger machen, meine Where-Klauseln wiederzuverwenden. Hier ist mein Anwendungsfall:Verwenden Sie SQL-Funktionen wie substr (X, Y, Z) in SQLAlchemy Query

Ich habe eine Tabelle (oder Modellklasse) von Dateiheadern, die ich abfragen, um Dateien bestimmter Typen zu identifizieren und aufzulisten.

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) 

Zum Beispiel Exif Bilder zu identifizieren, ich diese rohe Abfrage verwenden:

select * from blob where substr(header,7,4) = X'45786966' 

X'45786966' einfach die SQLite ist BLOB wörtliche für die Zeichenfolge Exif in ASCII codiert. In Wirklichkeit sind die where-Klauseln komplexer, und ich möchte sie als Filterbedingungen wieder verwenden für beitritt, etwa wie folgt aus:

# 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) 

Gibt es eine Möglichkeit, dies mit SQLAlchemy zu erreichen?

Antwort

2

Ok. Das war viel zu einfach.

from sqlalchemy.sql import func 
exif_conditions = [func.substr(Blob.header, 7, 4) == b'Exif']