Skip to main content
 首页 » 编程设计

python之需要有关加入 sqlalchemy 的帮助

2025年05月04日6lyj

我是 Python 和 SQL Alchemy 的新手,但不是底层开发和数据库概念。我知道我想做什么以及如何手动完成,但我正在努力学习 ORM 的工作原理。

我有两个表,图像和关键字。 Images 表包含一个作为其主键的 id 列,以及一些其他元数据。 Keywords 表仅包含一个 id 列(Images 的外键)和一个 keyword 列。我正在尝试使用声明性语法正确声明这种关系,我认为我做对了。

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')) 

我不断收到关于没有外键关系的错误,这对我来说似乎定义得很清楚。我看到了一些关于确保我得到正确的“加入”的东西,我正在使用“from 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 文档,试图自己拼凑出来。

如果有人能指出我遗漏的地方,我将不胜感激。

请您参考如下方法:

看来我仍然得到了错误版本的 join,甚至导入了 sqlalchemy.orm 下的版本。我这样做是为了解决问题:

from sqlalchemy.orm.util import join as join_ 
 
image = session.query(Image).select_from(join_(Image, Keyword)).\ 
    filter(Keyword.keyword == 'boy') 

这真的是“最正确”的解决方案,还是我遗漏了 Python 的一些细微差别?由于我还在学习,我想按照更有经验的人的建议,以“最正确”的方式做事。谢谢。