我正在尝试使用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_
,如果只有一个函数匹配,它将匹配,这不是我正在寻找的。 p>
也许我需要查询然后用Python处理结果?非常感谢任何帮助。