Форум сайта python.su
Сабж.
Есть две таблицы с одинаковыми 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]
})
Офлайн
УМВР
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)]
Офлайн
Большущее спасибо!
хотя с маппером то же самое получается, и тоже не работает :-)
Отредактировано (Сен. 23, 2009 16:54:53)
Офлайн