sqlalchemy: ссылка на столбец label () d в фильтре или предложении - PullRequest
6 голосов
/ 07 мая 2011

Я пытаюсь выполнить запрос, который работает на основе множества отношений между bmarks и тегами с помощью вторичной таблицы bmarks_tags.Запрос включает в себя несколько подзапросов, и мне нужно различить столбец.Позже я хочу присоединить это к другой таблице через идентификаторы DISTINCT.

Я пробовал несколько способов, и это кажется самым близким:

tagid = alias(Tag.tid.distinct())
test = select([bmarks_tags.c.bmark_id],
              from_obj=[bmarks_tags.join(DBSession.query(tagid.label('tagid'))),
                        bmarks_tags.c.tag_id == tagid])

 return DBSession.execute(qry)

Но я получаю ошибку:

⇝ AttributeError: '_UnaryExpression' object has no attribute 'named_with_column'

Кто-нибудь знает, как я могу выполнитьобъединение через bmarks_tags.tag_id и результат Tag.tid.distinct ()?

Спасибо

Схема:

# this is the secondary table that ties bmarks to tags
bmarks_tags = Table('bmark_tags', Base.metadata,
    Column('bmark_id', Integer, ForeignKey('bmarks.bid'), primary_key=True),
    Column('tag_id', Integer, ForeignKey('tags.tid'), primary_key=True)
)

class Tag(Base):
    """Bookmarks can have many many tags"""
    __tablename__ = "tags"

    tid = Column(Integer, autoincrement=True, primary_key=True)
    name = Column(Unicode(255), unique=True)

Ответы [ 2 ]

4 голосов
/ 10 мая 2011

Примерно так должно работать:

t = DBSession.query(Tag.tid.distinct().label('tid')).subquery('t')
test = select([bmarks_tags.c.bmark_id], bmarks_tags.c.tag_id == t.c.tid)
return DBSession.execute(test)
1 голос
/ 10 мая 2011

Трудно сказать, чего вы пытаетесь достичь, но, поскольку вы в любом случае используете orm (и в наши дни больше нет особых причин использовать голые выборы в sa), вам, вероятно, следует начать с создания множестваотношение ко-многим:

bmarks_tags = Table('bmark_tags', Base.metadata,
    Column('bmark_id', Integer, ForeignKey('bmarks.bid'), primary_key=True),
    Column('tag_id', Integer, ForeignKey('tags.tid'), primary_key=True)
)

class Tag(Base):
    """Bookmarks can have many many tags"""
    __tablename__ = "tags"

    tid = Column(Integer, primary_key=True)
    name = Column(Unicode(255), unique=True)

class BMark(Base):
    __tablename__ = 'bmarks'
    bid = Column(Integer, primary_key=True)
    tags = relation(Tag, secondary=bmarks_tags, backref="bmarks")

Затем получите ваш запрос и перейдите оттуда:

query = DBSession.query(BMark).join(BMark.tags)

Если нет, дайте нам фактический sql, который вы пытаетесь заставить вызывать sqlalchemy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...