概要
SQLAlchemyの行オブジェクトを辞書型と同じように扱おうとしても型が違うためうまくいきません。
何パターンか方法はあるのですが、2つ方法を紹介します。
具体例があったほうが分かりやすいので、サンプルとして下記のTodoクラスを元に説明します。
class Todo(db.Model):
__tablename__ = 'todos'
id = db.Column( db.Integer, primary_key=True )
description = db.Column( db.String(), nullable=False )
completed = db.Column( db.Boolean, nullable=False, default=False )
def __repr__(self):
return f'<Todo {self.id} {self.description}>'
方法1(__dict__
にアクセスする)
__dict__
プロパティにアクセスすることで辞書型の値を取得することができます。
ただしこの方法だと、_sa_instance_state
というプロパティも取得されてしまうので注意してください。
todo = Todo.query.first()
print( todo.__dict__ )
# {'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x10f4559e8>, 'completed': False, 'id': 17, 'description': 'TASK1'}
方法2(クラス側にdict型を返す関数を用意する)
クラス側に辞書型の値を返す関数を用意することでも辞書型の値を取得することができます。
todo = Todo.query.first()
print( todo.toDict() )
# {'id': 17, 'description': 'TASK1', 'completed': False}
class Todo(db.Model):
__tablename__ = 'todos'
id = db.Column( db.Integer, primary_key=True )
description = db.Column( db.String(), nullable=False )
completed = db.Column( db.Boolean, nullable=False, default=False )
list_id = db.Column( db.Integer, db.ForeignKey('todolists.id'), nullable=False )
def __repr__(self):
return f'<Todo {self.id} {self.description}>'
def toDict(self):
return {
'id': self.id,
'description': self.description,
'completed': self.completed
}
検索用
1. 行オブジェクトにプロパティを追加しようとした際のエラー
todo = Todo.query.first()
todo['label'] = 'Important'
# TypeError: 'Todo' object does not support item assignment
2. dict()関数を用いて型変換しようとした際のエラー
todo = Todo.query.first()
dict(todo)
# TypeError: 'Todo' object is not iterable