首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Python行对象转换为SQLAlchemy字典?

如何将Python行对象转换为SQLAlchemy字典?
EN

Stack Overflow用户
提问于 2009-12-24 20:42:34
回答 34查看 313.1K关注 0票数 318

有没有一种简单的方法来迭代列名和值对?

我的SQLAlchemy版本是0.5.6

下面是我尝试使用dict(row)的示例代码

代码语言:javascript
复制
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)

在我的系统输出上运行以下代码:

代码语言:javascript
复制
Traceback (most recent call last):
  File "untitled-1.py", line 37, in <module>
    print dict(u)
TypeError: 'User' object is not iterable
EN

回答 34

Stack Overflow用户

回答已采纳

发布于 2009-12-25 13:20:20

我不能得到一个好的答案,所以我使用这个:

代码语言:javascript
复制
def row2dict(row):
    d = {}
    for column in row.__table__.columns:
        d[column.name] = str(getattr(row, column.name))

    return d

编辑:如果上面的函数太长,不适合某些口味,这里只有一行代码(python 2.7+)

代码语言:javascript
复制
row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}
票数 168
EN

Stack Overflow用户

发布于 2012-04-29 14:31:44

您可以访问SQLAlchemy对象的内部__dict__,如下所示:

代码语言:javascript
复制
for u in session.query(User).all():
    print u.__dict__
票数 301
EN

Stack Overflow用户

发布于 2016-05-20 23:32:51

在SQLAlchemy v0.8及更高版本中,请使用inspection system

代码语言:javascript
复制
from sqlalchemy import inspect

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

user = session.query(User).first()

d = object_as_dict(user)

请注意,.key是属性名称,它可以与列名称不同,例如在以下情况下:

代码语言:javascript
复制
class_ = Column('class', Text)

这种方法也适用于column_property

票数 104
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1958219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档