329 votes

Convertir sqlalchemy ligne d'objet de python dict

Est-il un moyen simple pour effectuer une itération sur colonne de paires nom-valeur?

Ma version de sqlalchemy est 0.5.6

Voici un exemple de code où j'ai essayé d'utiliser dict(ligne), mais il jette exception TypeError: 'Utilisateur' objet n'est pas itérable

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)

L'exécution de ce code sur mon système de sorties:

sqlalchemy version: 0.5.6
Traceback (most recent call last):
  File "untitled-1.py", line 37, in <module>
    print dict(u)
TypeError: 'User' object is not iterable

310voto

hllau Points 1048

Vous pouvez accéder à l'interne __dict__ de SQLAlchemy objet, à l'instar de ce qui suit:

for u in session.query(User).all():
    print u.__dict__

172voto

Anurag Uniyal Points 31931

Je ne pouvais pas obtenir une bonne réponse donc j'utilise ceci:

def row2dict(row):
    d = {}
    for column in row.__table__.columns:
        d[column.name] = str(getattr(row, column.name))

    return d

Edit: si la fonction ci-dessus est trop long et pas adapté au goût de certains, ici, est en une seule ligne (python 2.7+)

row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}

163voto

Alex Brasetvik Points 5314
for row in resultproxy:
    row_as_dict = dict(row)

27voto

STB Points 21

@balki mentionné:

L' _asdict() méthode peut être utilisée si vous interrogez un domaine spécifique, car il est retourné comme un KeyedTuple.

In [1]: foo = db.session.query(Topic.name).first()
In [2]: foo._asdict()
Out[2]: {'name': u'blah'}

Alors que, si vous ne spécifiez pas une colonne, vous pouvez utiliser l'une des autres méthodes proposées, comme celui fourni par @charlax. Notez que cette méthode n'est valable que pour 2,7+.

In [1]: foo = db.session.query(Topic).first()
In [2]: {x.name: getattr(foo, x.name) for x in foo.__table__.columns}
Out[2]: {'name': u'blah'}

12voto

Marco Mariani Points 6907
from sqlalchemy.orm import class_mapper

def asdict(obj):
    return dict((col.name, getattr(obj, col.name))
                for col in class_mapper(obj.__class__).mapped_table.c)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X