目次
タイトルの通りですが、最近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を使ったことがなく一瞬戸惑いました。
同じように悩んでいる方の参考になれば幸いです。