2016-08-03 17 views
4

Ich verwende Flask, SQLAlchemy und Postgresql mit JSON-Feldtypen. ich Fragen habe Daten aus mit SQLAlchemy AbfrageAbfrage Wert aus JSON-Feld in Flask-SQLAlchemy mit Postgresql

Hier ist mein Modell Beispiel:

class WorkQueue(db.Model): 
    __tablename__ = "workQueue" 

    id = db.Column(db.Integer, primary_key=True) 
    field_data = db.Column(JSON) 

    def __init__(self, field_data = None): 
     self.field_data = field_data 

Hier ist ein Beispiel des Datensatzes ich in die Datenbank mich um

{ 
    "files": 
    [ 
     { 
      "added": 1470248644.093014, 
      "totalbytes": 1109630458, 
      "filename": "/home/me/project/static/uploads/file.ext", 
      "finished": false, 
      "basefilename": "file.ext", 
      "file_id": 21, 
      "numsegments": 2792 
     } 
    ], 
    "numfiles": 1, 
    "success": true 
} 

das ich habe, Probleme abfragen - versuchen, "WorkQueue ['files'] [0] ['file_id']" von einer als solche definierten Route zu finden:

@page.route('/remove/<int:id>', methods=['GET', 'POST']) 
def file_remove(id): 
    to_remove = id 

    # here is where I would query and delete, but I can't get this right 

Von psql wäre es so etwas wie dieses:

select * from "workQueue" t, json_array_elements(t.field_data->'files') as files WHERE CAST(files->>'file_id' AS INTEGER) = 1; 

einfach nicht

Antwort

6

etwas zu replizieren wie diese

from sqlalchemy import func, Integer 

files_subquery = session.query(func.json_array_elements(WorkQueue.field_data['files']).label('files')) \ 
         .subquery() 
query = session.query(WorkQueue.id, WorkQueue.field_data, files_subquery.c.files) \ 
       .filter(files_subquery.c.files.op('->>')('file_id').cast(Integer) == 1) 
+1

Perfekt illustriert, was ich fragen, in SQLAlchemy scheinen kann. Danke vielmals. – weevisss

+1

Diese Antwort verdient mehr als zwei Up-Stimmen. Ich habe alle Dokumentationen ausgegraben, konnte aber nicht herausfinden, wie es geht. Vielen Dank. – norbertpy

+0

Danke für das Teilen! :) – Augiwan

Verwandte Themen