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

我的SQLAlChemy版本是0.5.6

以下是我try 使用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)

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

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

推荐答案

我找不到一个好答案,所以我用了这个:

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

    return d

编辑:如果上面的函数太长并且不适合某些口味,这里是一个单行代码(python2.7+)

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

Python相关问答推荐

pandas MultiIndex是SQL复合索引的对应物吗?

为什么自定义pytree aux_data对于jnp.数组来说在.jit()之后跟踪,而对于np.数组来说则不是?

使用Python OpenCV的文本检测分割

键盘.任务组

如何在Power Query中按名称和时间总和进行分组

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

从今天起的future 12个月内使用Python迭代

在matplotlib动画gif中更改配色方案

Python中的函数中是否有充分的理由接受float而不接受int?

Python中的负前瞻性regex遇到麻烦

无法使用equals_html从网址获取全文

Pandas 有条件轮班操作

如何在Python脚本中附加一个Google tab(已经打开)

部分视图的DataFrame

使用Python和文件进行模糊输出

OpenCV轮廓.很难找到给定图像的所需轮廓

Python避免mypy在相互引用中从另一个类重定义类时失败

干燥化与列姆化的比较

如何在海上配对图中使某些标记周围的黑色边框