SQLAlchemy:处理结果

13 投票
2 回答
30874 浏览
提问于 2025-04-15 13:13

我想做一件比较简单的事情,就是输出列名和对应的列值,可能还想过滤掉一些列,让它们不显示。

这是我尝试的代码(当然是在最开始连接数据库之后):

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 进行基本查询的最重要的信息。

撰写回答