Я новичок в 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, пытаясь разобраться в этом сам.
Я был бы очень признателен всем, кто может указать, что яотсутствует.