Flask 如何实施";包含任何;烧瓶/炼金术?
SQLAlchemy中的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):
包含
操作只接受一个模型
对象,而不是对象列表。如果我想创建一个接受包含任何一组对象的过滤器,有没有比使用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
allcontains
-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%')