この記事は公開から2年以上経過しています。
SQLAlchemy(1.4)のORMでSubstringを使い、列値の部分文字列を取得したり部分一致での条件判定を行う方法。
本例ではデータベースにSQLite3を使用していますが、その他のDBでも同様の方法です。
対応
func.substr()
を使用する。
サンプルソースコード
テーブル定義
CREATE TABLE TEST_TBL(ID INTEGER PRIMARY KEY AUTOINCREMENT, VAL TEXT);
INSERT INTO TEST_TBL (VAL) VALUES
('ABCDEFG'),
('HIJKLMN'),
('OPQRSTU');
共通コード部分
import os
import sqlalchemy as sqlalc
import sqlalchemy.ext.declarative as alcexdecl
import sqlalchemy.orm as alcorm
Base = alcexdecl.declarative_base()
class TestTbl(Base):
__tablename__ = "TEST_TBL"
id = sqlalc.Column(sqlalc.Integer, primary_key=True)
val = sqlalc.Column(sqlalc.String)
def __repr__(self):
return f'{self.id} {self.val}'
db_file = '/var/tmp/test.db'
engine = sqlalc.create_engine(
f'sqlite:///{db_file}', echo=True)
where substring(c, i, n)のコード
with alcorm.sessionmaker(engine)() as ssn:
rows = ssn.query(TestTbl).filter(
sqlalc.func.substr(TestTbl.val, 4, 2) == 'KL')
for row in rows:
print(row)
生成SQL(ログ):
SELECT "TEST_TBL".id AS "TEST_TBL_id", "TEST_TBL".val AS "TEST_TBL_val"
FROM "TEST_TBL"
WHERE substr("TEST_TBL".val, ?, ?) = ?
結果:
2 HIJKLMN
select substring(c, i, n) のコード
with alcorm.sessionmaker(engine)() as ssn:
rows = ssn.query(TestTbl.id, sqlalc.func.substr(
TestTbl.val, 4, 2)).all()
for row in rows:
print(row)
生成SQL(ログ):
SELECT "TEST_TBL".id AS "TEST_TBL_id", substr("TEST_TBL".val, ?, ?) AS substr_1
FROM "TEST_TBL"
結果:
(1, 'DE')
(2, 'KL')
(3, 'RS')
以上です。