¿Cómo convertir un objeto de fila SQLAlchemy en un dictado de Python?
¿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
Aceptado
Puede acceder al interior __dict__
de un objeto SQLAlchemy, como el siguiente:
for u in session.query(User).all():
print u.__dict__
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