SQLAlchemy(Sqlite3)でpythonのリスト(配列)を利用する

公開日:
目次

タイトルの通りですが、最近SQLAlchemyでSqlite3を使っていて、リスト(配列)をデータベースに保存したいと思いました。

実際にやってみたところうまくいったので備忘録を残します。

SQLAlchemy(Sqlite3)でリストを利用する方法

SQLiteには直接的なリスト型が存在しないため、リストをそのままデータベースのフィールドとして格納することはできません。

しかし、リストを適切に文字列にシリアライズ(変換)して保存し、デシリアライズ(変換)して読み出す方法を取ることができます。

一つの一般的な方法として、JSONを利用する方法があります。

手順にしてみると下記のような感じです。

  • jsonモジュールを使用してリストをJSON文字列に変換
  • データベースに文字列として保存
  • 読み出し時にJSON文字列をリストに変換

SQLAlchemy(Sqlite3)でリストを利用する例

import json
from sqlalchemy import create_engine, Column, Integer, String, Text, Sequence
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# データベースエンジンの作成
engine = create_engine('sqlite:///:memory:')

# ベースの作成
Base = declarative_base()

# モデルの定義
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    hobbies = Column(Text)

    def __init__(self, name, hobbies):
        self.name = name
        self.hobbies = json.dumps(hobbies)  # リストをJSON文字列に変換して保存

    @property
    def hobbies_list(self):
        return json.loads(self.hobbies)  # JSON文字列をリストに変換


# テーブルの作成
Base.metadata.create_all(engine)

# セッションの作成
Session = sessionmaker(bind=engine)
session = Session()

# データの追加例
new_user = User(name='John Doe', hobbies=['reading', 'swimming', 'coding'])
session.add(new_user)
session.commit()

# データの取得とリストへの変換
saved_user = session.query(User).filter_by(name='John Doe').first()
print(saved_user.hobbies_list)  # ['reading', 'swimming', 'coding']

この例では以下の手順を踏みます:

  • hobbiesカラムをText型とし、リストをJSON文字列として保存。
  • __init__メソッドでリストをJSON文字列に変換して保存。
  • hobbies_listプロパティを使用してJSON文字列をリストに変換して取得。

これにより、SQLiteの制限を回避しながらリストを保存することができます。

経験者にとっては当たり前のことかもしれませんが、Sqliteを使ったことがなく一瞬戸惑いました。

同じように悩んでいる方の参考になれば幸いです。