Нужна помощь с объединениями в sqlalchemy - PullRequest
2 голосов
/ 21 декабря 2010

Я новичок в Python, а также в SQL Alchemy, но не в базовых концепциях разработки и баз данных.Я знаю, что я хочу сделать, и как бы я делал это вручную, но я пытаюсь узнать, как работает ORM.

У меня есть две таблицы, Изображения и Ключевые слова.Таблица Images содержит столбец id, который является его первичным ключом, а также некоторые другие метаданные.Таблица «Ключевые слова» содержит только столбец идентификаторов (внешний ключ к изображениям) и столбец ключевых слов.Я пытаюсь правильно объявить эти отношения, используя декларативный синтаксис, который, я думаю, я сделал правильно.

Base = declarative_base()

class Keyword(Base):
    __tablename__ = 'Keywords'
    __table_args__ = {'mysql_engine' : 'InnoDB'}

    id = Column(Integer, ForeignKey('Images.id', ondelete='CASCADE'),
            primary_key=True)
    keyword = Column(String(32), primary_key=True)

class Image(Base):
    __tablename__ = 'Images'
    __table_args__ = {'mysql_engine' : 'InnoDB'}

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(256), nullable=False)
    keywords = relationship(Keyword, backref='image')

Это представляет отношение многие ко многим.Одно изображение может иметь много ключевых слов, а одно ключевое слово может относиться ко многим изображениям.

Я хочу выполнить поиск по ключевым словам для моих изображений.Я попробовал следующее без удачи.

Концептуально это было бы неплохо, но я понимаю, почему это не работает.

image = session.query(Image).filter(Image.keywords.contains('boy'))

Я получаю ошибки об отсутствии постороннихключевые отношения, которые, кажется, четко определены для меня.Я видел кое-что о том, чтобы убедиться, что получил правильное «соединение», и я использую «из sqlalchemy.orm import join», но все же не повезло.

image = session.query(Image).select_from(join(Image, Keyword)).\
        filter(Keyword.keyword == 'boy')

Я добавил конкретное предложение объединения взапрос, чтобы помочь ему в этом, хотя, насколько я понимаю, мне не нужно было этого делать.

image = session.query(Image).select_from(join(Image, Keyword,
    Image.id==Keyword.id)).filter(Keyword.keyword == 'boy')

Итак, наконец, я сменил тактику и попытался запросить ключевые слова, а затем использовать обратную ссылку.Однако, когда я пытаюсь использовать итерацию «.images» для результата, я получаю сообщение об ошибке, что свойство «image» не существует, даже если я объявил его как обратную ссылку.

result = session.query(Keyword).filter(Keyword.keyword == 'boy').all()

Я хочу иметь возможность запрашивать уникальный набор совпадений изображений для набора ключевых слов.Я просто не могу угадать свой путь к синтаксису, и я потратил несколько дней, читая документацию по SQL Alchemy, пытаясь разобраться в этом сам.

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

1 Ответ

1 голос
/ 21 декабря 2010

Похоже, что я все еще получал неправильную версию объединения, даже импортировал ее в sqlalchemy.orm.Я сделал это, чтобы решить проблему:

from sqlalchemy.orm.util import join as join_

image = session.query(Image).select_from(join_(Image, Keyword)).\
    filter(Keyword.keyword == 'boy')

Это действительно «самое правильное» решение, или мне не хватает нюансов Python?Так как я все еще учусь, я хотел бы делать вещи «самым правильным» способом, как советуют те, у кого больше опыта.Спасибо.

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