首先为示例进行设置:
import datetime as dt from sqlalchemy import Column, Date, Integer, Text, create_engine, inspect fromsqlalchemy.ormimport 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方法的。方法名称以单个下划线开头,以匹配namedtupleAPI(它不是私有的!)。
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}