SQLAlchemy:处理结果
我想做一件比较简单的事情,就是输出列名和对应的列值,可能还想过滤掉一些列,让它们不显示。
这是我尝试的代码(当然是在最开始连接数据库之后):
metadata = MetaData(engine)
users_table = Table('fusion_users', metadata, autoload=True)
s = users_table.select(users_table.c.user_name == username)
results = s.execute()
if results.rowcount != 1:
return 'Sorry, user not found.'
else:
for result in results:
for x, y in result.items()
print x, y
我查看了SQLAlchemy(版本5)的API,但有点困惑。我的'result'在'results'中是一个RowProxy对象,但我觉得它没有返回正确的对象来使用.items()这个方法。
假设我的表结构是这样的:
user_id user_name user_password user_country
0 john a9fu93f39uf usa
我想过滤并指定要显示的列名(显然我不想显示用户密码)——我该怎么做呢?
2 个回答
16
SQLAlchemy中的RowProxy对象就像一个字典,提供了一些类似字典的方法。比如,你可以用.items()
来获取所有的名称/值对,使用.keys()
来获取所有的名称(比如可以用来显示在表头),然后再用.values()
来获取对应的值,或者直接用每个名称去访问RowProxy
对象中的内容等等。所以,它是一个“智能对象”,而不是普通的字典,这一点不会给你带来太多麻烦。
15
你可以直接把 results
当作一个迭代器来使用。
results = s.execute()
for row in results:
print row
选择特定的列可以这样做:
from sqlalchemy.sql import select
s = select([users_table.c.user_name, users_table.c.user_country], users_table.c.user_name == username)
for user_name, user_country in s.execute():
print user_name, user_country
如果你想在打印值的同时显示列名,你之前的方法是最好的,因为 RowProxy 实际上就是一个有序的字典。
我觉得 SqlAlchemy 的API文档对学习如何使用它并不是很有帮助。我建议你去看看这个 SQL表达式语言教程。里面包含了关于使用 SqlAlchemy 进行基本查询的最重要的信息。