SQLAlchemy ORMでSubstringを行う方法

この記事は公開から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')


以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする