tables - Cómo concatenar consultas no relacionadas en SqlAlchemy
sqlalchemy models (1)
Con base en la información provista, estoy georgizando que desea realizar una unión ( https://www.w3schools.com/sql/sql_union.asp ) en las diferentes tablas.
En el siguiente ejemplo, se crean las diferentes tablas, se crea una unión de estas tablas diferentes.
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 consulta final (en la declaración de impresión) devuelve:
[(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'')]
Esta respuesta se basa en: ¿Cómo unirse en varias tablas en SQLAlchemy?
¿Cómo puedo concatenar consultas sqlalchemy
sin relación y sort
por fecha?
por ejemplo, estos son los modelos:
Human
Car
Tree
Y todos tienen la columna created
. Aquí están las consultas:
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(...)
Ahora quiero concatenar estas 3 consultas y order_by
date. El resultado esperado sería algo así como:
date | instance
----------------------------
<created> | Human<instance>
<created> | Car<instance>
<created> | Car<instance>
<created> | Tree<instance>
<created> | Human<instance>
...