Как выполнить объединение в SQLAlchemy?

Пользователь

от delphine_bartoletti , в категории: Python , 6 месяцев назад

Как выполнить объединение в SQLAlchemy?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от fidel , 4 месяца назад

@delphine_bartoletti 

В SQLAlchemy объединение может быть выполнено с помощью метода join(). Этот метод принимает два параметра - таблицу, с которой надо выполнить объединение, и условия для объединения.


Например, если у вас есть две таблицы users и orders, и вам нужно выполнить объединение по столбцу user_id, вы можете выполнить следующий код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('postgresql://user:password@localhost/mydatabase')
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    orders = relationship("Order")

class Order(Base):
    __tablename__ = 'orders'

    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    product = Column(String)

Base.metadata.create_all(engine)

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

u = User(name='John')
session.add(u)
session.commit()

o = Order(user_id=u.id, product='Book')
session.add(o)
session.commit()

# выполнить объединение
result = session.query(User, Order).join(Order).all()

for user, order in result:
    print(user.name, order.product)


В данном случае мы сначала создали две таблицы - users и orders, а затем создали соответствующие им классы с помощью declarative_base().


Затем мы создали экземпляр класса User и класса Order, добавили их в сессию и сохранили изменения. Затем мы выполнении объединение с помощью метода join() и вывели результаты на экран.