2017-07-04 6 views
0

Wie kann ich sqlalchemy Abfragen ohne Beziehung und sort nach Datum verketten?So verketten Sie nicht verwandte Abfragen in SqlAlchemy

z.B. Dies sind die Modelle:

Human 
Car 
Tree 

Und sie haben die ganze Spalte created. Hier sind die Abfragen:

q1 = session.query(Human.created.label('created'), Human).filter(...) 
q2 = session.query(Car.created.label('created'), Car).filter(...) 
q3 = session.query(Tree.created.label('created'), Tree).filter(...) 

Jetzt habe ich diese 3 Fragen und order_by Datum verketten möchten. Das erwartete Ergebnis wäre etwas wie:

date  | instance 
---------------------------- 
<created> | Human<instance> 
<created> | Car<instance> 
<created> | Car<instance> 
<created> | Tree<instance> 
<created> | Human<instance> 
... 
+1

Wie würden Sie die SQL schreiben? – univerio

Antwort

0

Basierend auf den Informationen Ich bin geussing Sie eine Vereinigung (https://www.w3schools.com/sql/sql_union.asp) auf den verschiedenen Tabellen ausführen möchten.

In dem folgenden Beispiel werden die verschiedenen Tabellen erstellt, eine Vereinigung dieser verschiedenen Tabellen wird gemacht.

from sqlalchemy import Column, Integer, String, DateTime 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from datetime import datetime 

Base = declarative_base() 


class Human(Base): 
    __tablename__ = 'human' 
    id = Column('id', Integer, primary_key=True) 
    created = Column('created', DateTime) 
    name = Column('name', String(250)) 

    def __init__(self, created, name): 
     self.created = created 
     self.name = name 

    def __repr__(self): 
     return '<{created} - {name}>'.format(created=self.created, name=self.name) 


class Car(Base): 
    __tablename__ = 'car' 
    id = Column('id', Integer, primary_key=True) 
    created = Column('created', DateTime) 
    brand = Column(String(250)) 

    def __init__(self, created, brand): 
     self.created = created 
     self.brand = brand 

    def __repr__(self): 
     return '<{created} - {brand}>'.format(created=self.created, brand=self.brand) 


class Tree(Base): 
    __tablename__ = 'tree' 
    id = Column('id', Integer, primary_key=True) 
    created = Column('created', DateTime) 
    type = Column(String(250)) 

    def __init__(self, created, type): 
     self.created = created 
     self.type = type 

    def __repr__(self): 
     return '<{created} - {type}>'.format(created=self.created, type=self.type) 


engine = create_engine('sqlite:///') 
session = sessionmaker() 
session.configure(bind=engine) 
ex_ses = session() 
Base.metadata.create_all(engine) 

human = Human(datetime.now(), 'Human a') 
human2 = Human(datetime.now(), 'Human b') 
car = Car(datetime.now(), 'Car a') 
car2 = Car(datetime.now(), 'Car b') 
tree = Tree(datetime.now(), 'Tree a') 
tree2 = Tree(datetime.now(), 'Tree b') 

ex_ses.add(human) 
ex_ses.add(human2) 
ex_ses.add(car) 
ex_ses.add(car2) 
ex_ses.add(tree) 
ex_ses.add(tree2) 
ex_ses.commit() 

# Query 
h = ex_ses.query(Human.created, 'name') 
c = ex_ses.query(Car.created, 'brand') 
t = ex_ses.query(Tree.created, 'type') 

print(h.union_all(c).union_all(t).all()) 

Die letzte Abfrage (in der print-Anweisung) gibt:

[(datetime.datetime(2017, 7, 5, 5, 55, 54, 633863), 'Human a'), 
(datetime.datetime(2017, 7, 5, 5, 55, 54, 633863), 'Human b'), 
(datetime.datetime(2017, 7, 5, 5, 55, 54, 633863), 'Car a'), 
(datetime.datetime(2017, 7, 5, 5, 55, 54, 633863), 'Car b'), 
(datetime.datetime(2017, 7, 5, 5, 55, 54, 633863), 'Tree a'), 
(datetime.datetime(2017, 7, 5, 5, 55, 54, 633863), 'Tree b')] 

Diese Antwort basiert auf: How to union across multiple tables in SQLAlchemy?

+0

Schließen. Aber das gibt nur eine Spalte zurück, während ich die ganze Spalte jedes Typs (Auto, Baum, Mensch) mit unterschiedlicher Anzahl von Spalten brauche. – DKo

+0

Sie könnten die Antwort mit den weiteren Details aus dieser Frage kombinieren: https://stackoverflow.com/questions/7971798/sqlalchemy-union-with-different-number-of-columns. Gibt das eine Antwort auf Ihre Frage? –

Verwandte Themen