2017-07-04 1 views
0

Comment concaténer des requêtes sqlalchemy sans relation et sort par date?Comment concaténer des requêtes non liées dans SqlAlchemy

par exemple. Ce sont les modèles:

Human 
Car 
Tree 

Et ils ont tous la colonne created. Voici les questions:

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(...) 

Maintenant, je veux concaténer ces 3 requêtes et la date order_by. Le résultat attendu serait quelque chose comme:

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

Comment écririez-vous le SQL? – univerio

Répondre

0

Sur la base des informations fournies je geussing que vous souhaitez effectuer une union (https://www.w3schools.com/sql/sql_union.asp) sur les différentes tables.

Dans l'exemple ci-dessous, les différentes tables sont créées, une union de ces différentes tables est réalisée.

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

La requête finale (dans l'instruction d'impression) retourne:

[(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')] 

Cette réponse est basée sur: How to union across multiple tables in SQLAlchemy?

+0

Fermez. Mais cela ne fait que renvoyer une colonne alors que j'ai besoin de toute la colonne de chaque type (voiture, arbre, humain) avec un nombre différent de colonnes. – DKo

+0

Vous pouvez combiner la réponse fournie avec les autres détails de cette question: https://stackoverflow.com/questions/7971798/sqlalchemy-union-with-different-number-of-columns. Est-ce que cela répond à votre question? –