首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何引用sqlalchemy中的UNION结果的列?

如何引用sqlalchemy中的UNION结果的列?
EN

Stack Overflow用户
提问于 2022-02-04 00:56:34
回答 1查看 141关注 0票数 0

我有两张桌子,我正在从中提取名字

代码语言:javascript
运行
复制
animal_names = session.query(Animal.name)
human_names = session.query(Human.name)

我想要这两个人的结合

代码语言:javascript
运行
复制
all_names = animal_names.union(human_names)

这样我就可以把它和另一张桌子连接起来

代码语言:javascript
运行
复制
query = all_names.join(NameDirectory, NameDirectory.name == <SOMETHING>)

如何表示联接条件的右侧,因为我没有工会的列名?

在网上看,我希望这能奏效:

代码语言:javascript
运行
复制
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对象的第一列,以便在JOINWHERE之类的条件下使用它?

EN

回答 1

Stack Overflow用户

发布于 2022-02-04 05:36:34

我认为通过SQLAlchemy 1.4/2.0 select()风格的查询可以更好地解决这个问题。我能够重新安排连接并使用.subquery(),但我认为使用select()可能更好。有一个似乎仍然适用的从2020年起与工会讨论有关问题

代码

代码语言:javascript
运行
复制
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())

输出

代码语言:javascript
运行
复制
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',)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70980280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档