2009-07-28 3 views
9

나는 상대적으로 간단한 작업을하려고하는데, 열 이름과 해당 열 값을 뱉어 내고 일부 열을 필터링하여 표시되지 않도록 할 수 있습니다. 이것은 (물론 초기 연결 후) 내가 시도 할 것입니다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 보았다 오히려 혼란스러워했다. 결과에서 '결과'는 RowProxy이지만, .items() 호출에 대한 올바른 객체를 반환하지는 않는다고 생각합니다.

의 내 테이블 구조가 너무입니다 가정 해 봅시다 :

내가 필터링하고 표시하기 위해 열 이름을 지정하려면
user_id user_name user_password user_country 
0   john   a9fu93f39uf  usa 

(내가 분명히 user_password을 보여주고 싶은 그나마) -이 어떻게 달성 할 수 있습니까?

답변

10

이터레이터로 results을 즉시 사용할 수 있습니다. RowProxy 정말 아무것도 없기 때문에

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 

이 값에 추가로 열 이름 당신이 최선을 다해야합니다 귀하의 질문에 일을 한 방법을 인쇄하려면 : 특정 열을 선택

results = s.execute() 

for row in results: 
    print row 

는 다음과 같은 방식으로 이루어집니다 순서가 지정된 사전 이상.

IMO SqlAlchemy 용 API 설명서는 사용 방법을 배우는 데 도움이되지 않습니다. SQL Expression Language Tutorial을 읽어 보시기 바랍니다. 여기에는 SqlAlchemy를 사용한 기본 쿼리에 대한 가장 중요한 정보가 포함되어 있습니다.

+0

첫 번째 발췌 문장은 처음에 생각해 내고 모든 것을 반환했습니다. 두 번째 스 니펫의 경우 "ValueError : 압축 할 값이 너무 많습니다."- hrm? –

+0

아, 여분의 열을 지정하지 않았습니다. 다시 시도해보십시오. –

+0

TypeError : select()는 최대 2 개의 인수를 사용합니다 (주어진 4 개) >> s = users_table.select (users_table.c.user_name, users_table.c.user_location, users_table.c.user_name == username) –

14

SQLAlchemy의 RowProxy 객체 딕셔너리와 같은 방법이있다 - .items() 모든 이름/값 쌍 .keys() 단지 이름 (예를 들어 다음, 헤더 줄로 표시 해당 값 .values()을 사용하거나 각을 사용하여 얻을 수를 얻을 RowProxy 개체, 등등에 색인을 붙이는 열쇠 - 그래서 그것은 평범한 dict보다는 "똑똑한 객체"가되어서 불쾌감을 느끼지 않아야합니다.