SQLAlchemy:检查是否存在基于多对多关系的模型

时间:2017-11-22 00:57:34

标签: python sql postgresql sqlalchemy

我正在尝试使用SQLAlchemy模型在Postgres中存储类,在我存储新类之前,我想检查数据库中是否存在具有相同功能(具有相同的args和kwargs)的类。如果是这样,我只想为另一个模型的外键id。

目前我有BaseClass,ClassFunction及其关联模型:

class_function_assoc = Table('class_function_assocs', Base.metadata,
        Column('base_class_id', Integer, ForeignKey('base_classes.id')),
        Column('class_function_id', Integer, ForeignKey('class_functions.id'))
)

class BaseClass(Base):
    __tablename__ = 'base_classes'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    class_name = Column(String)
    class_pickle = Column(PickleType, nullable=False)

    functions = relationship('ClassFunction',
                               secondary=class_function_assoc,
                               back_populates='base_classes')

class ClassFunction(Base):
    __tablename__  = 'class_functions'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False, index=True)
    args = Column(ARRAY(String))
    kwargs = Column(JSON)

    base_classes = relationship('BaseClass',
                                 secondary=class_function_assoc,
                                 back_populates='functions')

假设我有一个我想考虑存储的新课程:

class TempClass():

    def func1(arg1):
        pass

    def func2(arg1, kwarg1=value1):
        pass

但是如何查询数据库以检查此类是否已存在?

我想将这些表连在一起,只有在函数完全相同的情况下才返回匹配。

我已经达到了:

q = (s.query(BaseClass)
.filter_by(class_name='TempClass')
.join(class_function_assoc)
.join(ClassFunction)
.filter(or_(
        and_(ClassFunction.name=='func1', args==['arg1']),
        and_(ClassFunction.name=='func2', args==['arg1'], kwargs={'kwarg1':'value1'})
)))

实际上会返回一个结果,但由于它正在使用or_,如果只有一个函数匹配,它将匹配,这不是我正在寻找的。

也许我需要查询然后用Python处理结果?非常感谢任何帮助。

0 个答案:

没有答案