SQLAlchemyを使用すると、特定の列が特定の文字列で始まるすべての行を簡単に取得できます。しかし、文字列の先頭が列と一致する行を取得するように、それを裏返すにはどうすればよいですか?
つまり、文字列が「stackoverflow」の場合、値が「stack」の行と一致させたいと思います。
必要に応じて、文字列だけでなく正規表現を列に格納できますが、正規表現の比較を逆にする方法もわかりません。
SQLAlchemyを使用すると、特定の列が特定の文字列で始まるすべての行を簡単に取得できます。しかし、文字列の先頭が列と一致する行を取得するように、それを裏返すにはどうすればよいですか?
つまり、文字列が「stackoverflow」の場合、値が「stack」の行と一致させたいと思います。
必要に応じて、文字列だけでなく正規表現を列に格納できますが、正規表現の比較を逆にする方法もわかりません。
これは、sqlalchemy 式として実装されたSQL ソリューションです。
class Foo(Base):
__tablename__="foo_tablename"
bar = Column(String(80))
bar = 'stackoverflow'
session.query(Foo).filter(literal('stackoverflow').like(func.concat(Foo.bar, '%')))
SQLAlchey ログには、生成されたクエリが表示されます。
>>INFO sqlalchemy.engine.base.Engine SELECT bar FROM foo_tablename WHERE :param1 LIKE CONCAT(foo_tablename.bar_column,'%')
>>INFO sqlalchemy.engine.base.Engine {'param1': 'stack'}
ご注意ください:
したがって、そのような機能を本番環境に追加する必要がある場合は、データベースが提供する全文検索機能の使用を検討します。SQLAlchemy は、データベース固有の機能であるため、全文検索をサポートしていません。PostgreSQL 全文検索と SQLAlchemy を組み合わせた例を参照してください。
更新しました
ユーザーAudrius Kažukauskasは、生の SQL を取り除く方法を提案しました。したがって、これにより、リテラル SQL を使用する際の制限が取り除かれます。
たぶんもっと良い方法があるかもしれませんが、これはうまくいくはずです:
bar = 'stackoverflow'
session.query(Foo).filter(
Foo.data.in_([bar[:i] for i in xrange(5, len(bar) + 1)])
)