SQLAlchemy:对结果进行操作

med*_*iev 11 python sql 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
Run Code Online (Sandbox Code Playgroud)

我查看了SQLAlchemy(v.5)上的API,但是很困惑.'结果'中的'结果'是一个RowProxy,但我认为它不会为.items()调用返回正确的对象.

假设我的表结构是这样的:

user_id    user_name    user_password    user_country
0          john         a9fu93f39uf      usa
Run Code Online (Sandbox Code Playgroud)

我想过滤并指定要显示的列名称(我不想显示user_password) - 我该如何实现?

Ale*_*lli 16

SQLAlchemy RowProxy对象具有类似dict的方法 - .items()获取所有名称/值对,.keys()获取名称(例如,将它们显示为标题行,然后.values()用于相应的值或使用每个键索引到RowProxy对象,等等 - 所以它是一个"聪明的对象",而不是一个简单的字典不应该不适当地给你带来不便.


seb*_*sgo 14

您可以results立即用作迭代器.

results = s.execute()

for row in results:
    print row
Run Code Online (Sandbox Code Playgroud)

选择特定列的方法如下:

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
Run Code Online (Sandbox Code Playgroud)

要按照你在问题中所做的方式打印值之外的列名应该是最好的,因为RowProxy实际上只不过是一个有序字典.

IMO SqlAlchemy的API文档对于学习如何使用它并不是很有帮助.我建议你阅读SQL Expression Language Tutorial.它包含有关使用SqlAlchemy进行基本查询的最重要信息.