¿Cómo convertir un objeto de fila SQLAlchemy en un dictado de Python?

Resuelto Anurag Uniyal asked hace 14 años • 46 respuestas

¿Existe una forma sencilla de iterar sobre los pares de nombre y valor de columna?

Mi versión de SQLAlchemy es 0.5.6

Aquí está el código de muestra donde intenté usar dict(row):

import sqlalchemy
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

print "sqlalchemy version:",sqlalchemy.__version__ 

engine = create_engine('sqlite:///:memory:', echo=False)
metadata = MetaData()
users_table = Table('users', metadata,
     Column('id', Integer, primary_key=True),
     Column('name', String),
)
metadata.create_all(engine) 

class User(declarative_base()):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    
    def __init__(self, name):
        self.name = name

Session = sessionmaker(bind=engine)
session = Session()

user1 = User("anurag")
session.add(user1)
session.commit()

# uncommenting next line throws exception 'TypeError: 'User' object is not iterable'
#print dict(user1)
# this one also throws 'TypeError: 'User' object is not iterable'
for u in session.query(User).all():
    print dict(u)

Ejecutando este código en las salidas de mi sistema:

Traceback (most recent call last):
  File "untitled-1.py", line 37, in <module>
    print dict(u)
TypeError: 'User' object is not iterable
Anurag Uniyal avatar Dec 24 '09 19:12 Anurag Uniyal
Aceptado

Puede acceder al interior __dict__de un objeto SQLAlchemy, como el siguiente:

for u in session.query(User).all():
    print u.__dict__
hllau avatar Apr 29 '2012 06:04 hllau

Según @zzzeek en los comentarios:

tenga en cuenta que esta es la respuesta correcta para las versiones modernas de SQLAlchemy, asumiendo que "fila" es un objeto de fila principal, no una instancia asignada por ORM.

for row in resultproxy:
    row_as_dict = row._mapping  # SQLAlchemy 1.4 and greater
    # row_as_dict = dict(row)  # SQLAlchemy 1.3 and earlier

Antecedentes sobre row._mapping, nuevo a partir de SQLAlchemy 1.4: https://docs.sqlalchemy.org/en/stable/core/connections.html#sqlalchemy.engine.Row._mapping

Alex Brasetvik avatar Dec 24 '2009 12:12 Alex Brasetvik