Python SQLAlchemy与过滤连接不';我真的不过滤
问题在主题的标题中。下面是细节 我正在使用Flask SQLAlchemy和PostgreSQL,我的db模式如下:Python SQLAlchemy与过滤连接不';我真的不过滤,python,database-design,orm,sqlalchemy,flask,Python,Database Design,Orm,Sqlalchemy,Flask,问题在主题的标题中。下面是细节 我正在使用Flask SQLAlchemy和PostgreSQL,我的db模式如下: class Settings(db.Model): id = db.Column(db.Integer, primary_key=True) key = db.Column(db.String(), unique=True) lang = db.relationship('Lang', order_by='Lang.id') def __ini
class Settings(db.Model):
id = db.Column(db.Integer, primary_key=True)
key = db.Column(db.String(), unique=True)
lang = db.relationship('Lang', order_by='Lang.id')
def __init__(self, key, lang):
self.key = key
self.lang = lang
def __repr__(self):
return '<Settings %r, %r>' % (self.key, self.lang)
class Lang(db.Model):
__tablename__ = 'settings_lang'
id = db.Column(db.Integer, primary_key=True)
lang = db.Column(db.String(2))
value = db.Column(db.Text())
parent_id = db.Column(db.Integer, db.ForeignKey('settings.id'))
def __init__(self, lang, value):
self.lang = lang
self.value = value
def __repr__(self):
return '<Lang %r, %r>' % (self.lang, self.value)
for data in db.session.query(Settings).join(Lang).filter(Lang.lang.contains('en')).all():
print data
并期望它只返回带有“en”语言的设置。但是,我得到了所有的语言
问题可能是什么?如何处理
UPD:SQL输出
SELECT settings.id AS settings_id, settings.key AS settings_key
FROM settings JOIN settings_lang ON settings.id = settings_lang.parent_id
WHERE settings_lang.lang LIKE '%%' || %(lang_1)s || '%%'
{'lang_1': 'en'}
SELECT settings_lang.id AS settings_lang_id, settings_lang.lang AS settings_lang_lang,
settings_lang.value AS settings_lang_value,
settings_lang.parent_id AS settings_lang_parent_id
FROM settings_lang
WHERE %(param_1)s = settings_lang.parent_id ORDER BY settings_lang.id
{'param_1': 1}
设置中的示例行\u lang:
id parent_id lang value
1 1 "en" "Research"
2 1 "ru" "НПП"
id父项\u id语言值
1 1“en”“研究”
2 1“ru”“ППП”另请参阅如何打印由AlchemyTank执行的原始sql查询,可能会有所帮助。也许查询是以某种方式构造的,第一个查询看起来正常,它只加载设置对象,但最好编写
过滤器(Lang.Lang='en')
。第二个只是按照关系后面的id加载Lang
。所以我不相信你的查询会加载所有设置。请再次查看您的数据库和程序输出。问题是设置不包含语言。它包含id和key,但Lang包含id、parent\u id、value和Lang。因此,当我们按id检索记录时,它返回两种语言,因为parent\u id对于这两种语言都是相同的,似乎我只是意外地解决了我的问题。下面的查询给出了我想要的:db.session.query(Settings.key,Lang.value).join(Settings.Lang).filter(Lang.Lang=='en')