Уведомления

Группа в Telegram: @pythonsu

#1 Май 14, 2014 13:47:29

pyr0
Зарегистрирован: 2013-12-18
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить данные из связаных таблиц (Many To Many, SQLAlchemy)?

Имеются две модели со связью многие ко многим (SQLAlchemy):

association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)
class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Child",
                    secondary="association",
                    backref="parents")
class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)

Получить “всех родителей одного (второго по списку) ребенка” можно таким способом:

parents = session.query(Parent).filter(Parent.children.any(id=2))

А как получить “всех детей одного из родителей”?

Офлайн

#2 Май 14, 2014 16:14:51

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Как получить данные из связаных таблиц (Many To Many, SQLAlchemy)?

from sqlalchemy import create_engine, Column, Integer, Table, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
 
Base = declarative_base()
 
association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)
 
class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Child", secondary=association_table, backref="parent")
 
    def __repr__(self):
        return '<Parent(id={})>'.format(self.id)
 
class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)
    def __repr__(self):
        return '<Child(id={})>'.format(self.id)
 
 
engine = create_engine('mysql://{login}:{password}@{server}:{port}/{db}'.format(
            login='test',
            password='test',
            server='localhost',
            port=3306,
            db='test',
        ))
session = sessionmaker(bind=engine)()
 
# -------------------------------------------------------------------------------
 
p1 = Parent(id=1)
p2 = Parent(id=2)
 
c1 = Child(id=1)
c2 = Child(id=2)
c3 = Child(id=3)
 
p1.children = [c1, c2]
p2.children = [c2, c3]
 
session.add(p1)
session.add(p2)
session.commit()
 
print '{} childrens: {}'.format(p1, p1.children)
print '{} parents: {}'.format(c2, c2.parent)

Вывод:
<Parent(id=1)> childrens: [<Child(id=1)>, <Child(id=2)>]
<Child(id=2)> parents: [<Parent(id=1)>, <Parent(id=2)>]

Отредактировано GreyZmeem (Май 14, 2014 16:15:50)

Офлайн

#3 Май 15, 2014 17:52:26

pyr0
Зарегистрирован: 2013-12-18
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить данные из связаных таблиц (Many To Many, SQLAlchemy)?

GreyZmeem
Вы выводите объекты созданные в интерпретаторе. А мне необходимо “достать” их из базы. Мне помогло это

Офлайн

#4 Май 15, 2014 18:07:39

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Как получить данные из связаных таблиц (Many To Many, SQLAlchemy)?

Можно как написано на stackoverflow, на для этих целей и для удобства и нужен backref
Код приведенный выше рабочий.

c2 = session.query(Child).get(2)
print '{} parents: {}'.format(c2, c2.parent)
<Child(id=2)> parents: [<Parent(id=1)>, <Parent(id=2)>]

Офлайн

#5 Май 15, 2014 18:11:16

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Как получить данные из связаных таблиц (Many To Many, SQLAlchemy)?

pyr0
Вам бы больше помогла документация. Или вообще любая статья по алхимии

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version