Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2009 12:34:11

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy: не получается left outer join

Сабж.

Есть две таблицы с одинаковыми port_id. В левой содержится перечень всех юнитов, а в правой - только часть.
Нужно получить список всех юнитов, неважно, есть ли им соответствия в правой таблице.

Пробовала так:
port_util = port_cpop.outerjoin(ta_util, port_cpop.c.id_port == ta_util.c.id_port)
и так:
port_util = outerjoin(port_cpop, ta_util, port_cpop.c.id_port == ta_util.c.id_port)
и так:
port_util = join(port_cpop, ta_util, port_cpop.c.id_port == ta_util.c.id_port, isouter = True)

Ошибку не выдает, но работает как обычный inner join, цепляя из левой таблицы только те строчки, для которых есть соответствие в правой.

Вот тут полностью:

from sqlalchemy.sql.expression import *
from turbogears.database import metadata, mapper


port_cpop = Table('ta_port_cpop', metadata,
Column('port_id', Integer, primary_key=True),
Column('port_name', String(50)),
)

ta_util= Table('ta_port_util', metadata,
Column('port_id', Integer, ForeignKey('port_cpop.port_id'), primary_key=True),
Column('port_util', Integer)),
)

port_util = port_cpop.outerjoin(ta_util, port_cpop.c.id_port == ta_util.c.id_port) #<---- вот тут

class Port(object): pass

mapper(Port, port_util, properties = {
'id_port':[port_cpop.c.id_port, ta_util.c.id_port]
})
Чиво делать?



Офлайн

#2 Сен. 22, 2009 17:50:49

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy: не получается left outer join

УМВР

from sqlalchemy import *

engine = create_engine('sqlite:///sample.db')

metadata = MetaData(bind=engine)

port_cpop = Table('port_cpop', metadata,
Column('port_id', Integer, primary_key=True),
Column('port_name', String(50)),
)
port_cpop.create()

port_util= Table('port_util', metadata,
Column('port_id', Integer, ForeignKey('port_cpop.port_id'), primary_key=True),
Column('port_util', String(50)),
)
port_util.create()

port_cpop.insert().execute([
{'port_id': 80, 'port_name': 'http'},
{'port_id': 22, 'port_name': 'ssh'},
{'port_id': 21, 'port_name': 'smtp'},
])
port_util.insert().execute([
{'port_id': 80, 'port_util': 'apache'},
{'port_id': 22, 'port_util': 'openssh'},
{'port_id': 5432, 'port_util': 'postgresql'},
])



joined_left = port_cpop.outerjoin(port_util)
joined_right = port_util.outerjoin(port_cpop)

print "left"
print joined_left.select().execute().fetchall()
# -> [(21, u'smtp', None, None), (22, u'ssh', 22, u'openssh'), (80, u'http', 80, u'apache')]
print "right"
print joined_right.select().execute().fetchall()
# -> [(22, u'openssh', 22, u'ssh'), (80, u'apache', 80, u'http'), (5432, u'postgresql', None, None)]



Офлайн

#3 Сен. 23, 2009 15:07:19

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy: не получается left outer join

Большущее спасибо!

хотя с маппером то же самое получается, и тоже не работает :-)



Отредактировано (Сен. 23, 2009 16:54:53)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version