我有两张桌子,我正在从中提取名字
animal_names = session.query(Animal.name)
human_names = session.query(Human.name)
我想要这两个人的结合
all_names = animal_names.union(human_names)
这样我就可以把它和另一张桌子连接起来
query = all_names.join(NameDirectory, NameDirectory.name == <SOMETHING>)
如何表示联接条件的右侧,因为我没有工会的列名?
在网上看,我希望这能奏效:
animal_names = session.query(Animal.name).label("name")
human_names = session.query(Human.name).label("name")
all_names = animal_names.union(human_names)
query = all_names.join(NameDirectory, NameDirectory.name == all_names.c.name)
但我得到了AttributeError: 'Query' object has no attribute 'c'
。是否有方法引用Query
对象的第一列,以便在JOIN
或WHERE
之类的条件下使用它?
发布于 2022-02-04 05:36:34
我认为通过SQLAlchemy 1.4/2.0 select()
风格的查询可以更好地解决这个问题。我能够重新安排连接并使用.subquery()
,但我认为使用select()
可能更好。有一个似乎仍然适用的从2020年起与工会讨论有关问题。
代码
from sqlalchemy import (
create_engine,
Integer,
String,
)
from sqlalchemy.schema import (
Column,
)
from sqlalchemy.sql import select, union
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import Session
Base = declarative_base()
engine = create_engine("sqlite://", echo=False)
class Animal(Base):
__tablename__ = 'animals'
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
class Human(Base):
__tablename__ = 'humans'
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
class NameDirectory(Base):
__tablename__ = 'name_directories'
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
Base.metadata.create_all(engine)
with Session(engine) as session:
dog = Animal(name='Spot')
human = Human(name='Guy')
human2 = Human(name='Man')
session.add_all([dog, human, human2])
for obj in (dog, human):
session.add(NameDirectory(name=obj.name))
session.commit()
with Session(engine) as session:
all_names = session.query(Animal.name.label("name")).union(session.query(Human.name.label("name"))).subquery('all_names')
query = session.query(NameDirectory.name).join(all_names, all_names.c.name == NameDirectory.name)
print(query)
print(query.all())
with Session(engine) as session:
q1 = select([Animal.name.label('name')]).select_from(Animal)
q2 = select([Human.name.label('name')]).select_from(Human)
sub = union(q1, q2).alias()
q = select([sub.c.name]).select_from(sub.join(NameDirectory, sub.c.name == NameDirectory.name))
print(q)
print(session.execute(q).all())
输出
SELECT name_directories.name AS name_directories_name
FROM name_directories JOIN (SELECT anon_1.name AS name
FROM (SELECT animals.name AS name
FROM animals UNION SELECT humans.name AS name
FROM humans) AS anon_1) AS all_names ON all_names.name = name_directories.name
[('Spot',), ('Guy',)]
SELECT anon_1.name
FROM (SELECT animals.name AS name
FROM animals UNION SELECT humans.name AS name
FROM humans) AS anon_1 JOIN name_directories ON anon_1.name = name_directories.name
[('Spot',), ('Guy',)]
https://stackoverflow.com/questions/70980280
复制相似问题