Note that there are some explanatory texts on larger screens.

plurals
  1. POSQLAlchemy join with filtering doesn't actually filter
    text
    copied!<p>The problem is in the header of topic. So here are the details.</p> <p>I am using Flask-SQLAlchemy and PostgreSQL and my db schema is like this:</p> <pre><code>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 '&lt;Settings %r, %r&gt;' % (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 '&lt;Lang %r, %r&gt;' % (self.lang, self.value) </code></pre> <p>I use query like this:</p> <pre><code>for data in db.session.query(Settings).join(Lang).filter(Lang.lang.contains('en')).all(): print data </code></pre> <p>And expect it to return only settings with 'en' language. But instead I get all the languages.</p> <p>What can be the problem and how to deal with it?</p> <p>UPD: SQL output</p> <pre><code>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} </code></pre> <p>Example row from settings_lang:</p> <pre> id parent_id lang value 1 1 "en" "Research" 2 1 "ru" "НПП"</pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload