Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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
Flask 如何实施";包含任何;烧瓶/炼金术?_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Flask 如何实施";包含任何;烧瓶/炼金术?

Flask 如何实施";包含任何;烧瓶/炼金术?,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,SQLAlchemy中的包含操作只接受一个模型对象,而不是对象列表。如果我想创建一个接受包含任何一组对象的过滤器,有没有比使用contains并将它们与union组合创建多个过滤器更具SQL风格的方法 例如,请参见以下代码: from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app) class User(db.Model):

SQLAlchemy中的
包含
操作只接受一个
模型
对象,而不是对象列表。如果我想创建一个接受包含任何一组对象的过滤器,有没有比使用contains并将它们与
union
组合创建多个过滤器更具SQL风格的方法

例如,请参见以下代码:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class User(db.Model):
    id              = db.Column(db.Integer, primary_key = True)
    name            = db.Column(db.String(100))
    son             = db.relationship('Son', backref = 'parent', lazy = 'dynamic')
    def __repr__(self):
        return '<"%s">' % self.name
class Son(db.Model):
    id              = db.Column(db.Integer, primary_key = True)
    name            = db.Column(db.String(1000))
    user_id         = db.Column(db.Integer, db.ForeignKey('user.id'))
    def __repr__(self):
        return '<"%s">' % self.name

db.create_all()

son1 = Son(name = '1 a 1')
son2 = Son(name = '1 b 1')
son3 = Son(name = '1 c 1')
son4 = Son(name = '2 a 2')
son5 = Son(name = '2 b 2')
user0 = User(name = 'w1')
user1 = User(name = 'w2')
user2 = User(name = 'w3')
user0.son.append(son1)
user0.son.append(son2)
user1.son.append(son3)
user1.son.append(son4)
user2.son.append(son5)

db.session.add(son1)
db.session.add(son2)
db.session.add(son3)
db.session.add(son4)
db.session.add(son5)
db.session.add(user0)
db.session.add(user1)
db.session.add(user2)

db.session.commit()
son_query = Son.query.filter(Son.name.ilike('%a%'))
son_query_all = son_query.all()
print son_query.all()
user_query = User.query.filter(User.son.contains(son_query_all[0])).union(*[User.query.filter(User.son.contains(query)) for query in son_query_all[1:]])
print user_query.all()

请注意,我当然可以使用
union
contains
操作为相同目的定义自定义
contains\u任何
函数。我的问题是,是否有比简单的
union
all
contains
-ed更有效的方法?

解决这种过滤的正确方法是使用。基本上,您将
Son
表与
User
表联接,并按联接实体的字段进行过滤

在SQLAlchemy中,您可以这样表达:

User.query.join(Son).filter(Son.name.ilike('%a%'))
它将生成以下SQL:

SELECT * FROM user 
JOIN son ON user.id = son.user_id 
WHERE lower(son.name) LIKE lower('%a%')
SELECT * FROM user 
JOIN son ON user.id = son.user_id 
WHERE lower(son.name) LIKE lower('%a%')