2013-01-24 47 views
3

我学习的SQLAlchemy的表达式语言,和我试图执行返回通过select([users.c.id, users.c.id])单一重复列一个简单的查询:如何强制SQLAlchemy包含重复列?

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, insert, select 
engine = create_engine('sqlite:///:memory:', echo=True) 
conn = engine.connect() 
metadata = MetaData() 
users = Table('users', metadata, 
Column('id', Integer, primary_key=True), 
Column('name', String), 
Column('fullname', String), 
) 
metadata.create_all(engine) 
conn.execute(users.insert(), [ 
{'id': 1, 'name' : 'jack', 'fullname': 'Jack Jones'}, 
{'id': 2, 'name' : 'wendy', 'fullname': 'Wendy Williams'}, 
]) 
print(list(conn.execute(select([users.c.id, users.c.id])))) 

,输出:

[(1,), (2,)] 

即仅两个请求的列之一。我预计:

[(1, 2), (2, 2)] 

要仔细检查了我的预期是正确的,我直接在sqlite3的跑的等效查询和PostgreSQL 9.2([1],[2]下面),两者都正确返回重复的IDS 。我正在使用SQLAlchemy版本0.8.0b2,Python 3.2.3,sqlite3 3.6.12和Mac OS X 10.6和10.7。

在此先感谢!

[1] SQLITE3

$ sqlite3 temp.db 
CREATE TABLE users(id INTEGER, name TEXT, fullname TEXT); 
INSERT INTO users VALUES(1, 'jack', 'Jack Jones'); 
INSERT INTO users VALUES(2, 'wendy', 'Wendy Williams'); 
SELECT id, id FROM users; 
-> 
1|1 
2|2 

[2]的PostgreSQL

$ /Library/PostgreSQL/9.2/bin/psql -U postgres 
CREATE DATABASE temp; 
CREATE TABLE users(id INTEGER, name TEXT, fullname TEXT); 
INSERT INTO users VALUES(1, 'jack', 'Jack Jones'); 
INSERT INTO users VALUES(2, 'wendy', 'Wendy Williams'); 
SELECT id, id FROM users; 
-> 
1 | 1 
2 | 2 

回答

5

至少你的列中的一需要的标签来创建两者之间的区别。

print(list(conn.execute(select([users.c.id, users.c.id.label('id2')]))))