將查詢結果轉換為 dict

首先是示例的設定:

import datetime as dt
from sqlalchemy import Column, Date, Integer, Text, create_engine, inspect
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
Session = sessionmaker()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(Text, nullable=False)
    birthday = Column(Date)

engine = create_engine('sqlite://')
Base.metadata.create_all(bind=engine)
Session.configure(bind=engine)

session = Session()
session.add(User(name='Alice', birthday=dt.date(1990, 1, 1)))
session.commit()

如果你單獨查詢列,則該行是 KeyedTuple,其中包含 _asdict 方法。方法名稱以單個下劃線開頭,以匹配 namedtuple API(它不是私有的!)。

query = session.query(User.name, User.birthday)
for row in query:
    print(row._asdict())

使用 ORM 檢索物件時,預設情況下不可用。應該使用 SQLAlchemy 檢查系統

def object_as_dict(obj):
    return {c.key: getattr(obj, c.key)
            for c in inspect(obj).mapper.column_attrs}

query = session.query(User)
for user in query:
    print(object_as_dict(user))

在這裡,我們建立了一個執行轉換的函式,但是一個選項是將方法新增到基類。

你可以從自己的類建立它,而不是使用上面的 declarative_base

from sqlalchemy.ext.declarative import as_declarative

@as_declarative()
class Base:
    def _asdict(self):
        return {c.key: getattr(self, c.key)
                for c in inspect(self).mapper.column_attrs}