Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask SQLAlchemy-如何查询数据库中匹配相关对象属性的对象?_Python_Sql_Flask_Sqlalchemy - Fatal编程技术网

Python Flask SQLAlchemy-如何查询数据库中匹配相关对象属性的对象?

Python Flask SQLAlchemy-如何查询数据库中匹配相关对象属性的对象?,python,sql,flask,sqlalchemy,Python,Sql,Flask,Sqlalchemy,我有一个烧瓶应用程序,其中我有一个简单的应变对象,多对多字段设置为另一个对象,萜烯 每个萜烯都有一个FK字段,用于连接另一个对象,即化合物 每个菌株有5种萜烯 我想选择一个菌株,并用ORM查询数据库,以检索任何其他菌株,这些菌株至少有3个与所选菌株匹配的萜烯 我如何用ORM实现其中的查询部分 示例:菌株A-芳樟醇-月桂烯-石竹烯-蒎烯-柠檬烯 使用ORM查询的菌株返回,其中菌株A中至少含有3种萜烯 菌株B-芳樟醇-月桂烯-石竹烯-香叶醇-胡萝卜烯 菌株c-石竹烯-蒎烯-柠檬烯-香叶醇-胡萝卜烯首

我有一个烧瓶应用程序,其中我有一个简单的应变对象,多对多字段设置为另一个对象,萜烯

每个萜烯都有一个FK字段,用于连接另一个对象,即化合物

每个菌株有5种萜烯

我想选择一个菌株,并用ORM查询数据库,以检索任何其他菌株,这些菌株至少有3个与所选菌株匹配的萜烯

我如何用ORM实现其中的查询部分

示例:菌株A-芳樟醇-月桂烯-石竹烯-蒎烯-柠檬烯

使用ORM查询的菌株返回,其中菌株A中至少含有3种萜烯

菌株B-芳樟醇-月桂烯-石竹烯-香叶醇-胡萝卜烯


菌株c-石竹烯-蒎烯-柠檬烯-香叶醇-胡萝卜烯

首先选择菌株、萜烯和化合物的连接。然后用A的萜烯进行过滤,按菌株分组,最后检查该组至少有3个匹配项:

from app import db


terpenes = db.Table('tags', 
                    db.Column(
                        'terpene_id', db.Integer, 
                        db.ForeignKey('terpene.id'), 
                        primary_key=True
                    ),
                    db.Column(
                        'strain_id', db.Integer, 
                        db.ForeignKey('strain.id'), 
                        primary_key=True
                    )
                    )


class Compound(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(96), nullable=False)
    percent_concentration = db.Column(db.Numeric(precision=10, scale=20), nullable=True)
    terpenes = db.relationship('Terpene', backref='compound', lazy=True)

    def __repr__(self):
        return f'<Compound {self.name} @{self.percent_concentration}%>'.format(self.name, self.percent_concentration)


class Terpene(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    compound_id = db.Column(db.Integer, db.ForeignKey('compound.id'), nullable=False)

    @property
    def serialize(self):
        return {
            'id': self.id,
            'compound_id': self.compound.name
        }

    def __repr__(self):
        return '<Terpene %r>' % self.compound.name


class Strain(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(96), unique=True, nullable=False)
    terpenes = db.relationship('Terpene', secondary=terpenes, lazy='subquery', backref=db.backref('strains', lazy=True))

    @property
    def serialize(self):
        return {
            'id': self.id,
            'name': self.name,
            'terpenes': self.serialize_many2many,
        }

    @property
    def serialize_many2many(self):
        return [i.serialize for i in self.terpenes]

    def __repr__(self):
        return '<Strain %r>' % self.name
In [19]: strain_a_terpenes = db.session.query(Compound.name).\
    ...:     join("terpenes", "strains").\
    ...:     filter(Strain.name == "A").\
    ...:     subquery()
    ...: 

In [20]: db.session.query(Strain).\
    ...:     join("terpenes", "compound").\
    ...:     filter(Compound.name.in_(strain_a_terpenes)).\
    ...:     group_by(Strain.id).\
    ...:     having(db.func.count() >= 3).\
    ...:     all()