我正在学习SQLAlchemy表达式语言,并且正在尝试执行一个琐碎的查询,该查询通过select([users.c.id, users.c.id])以下方式返回单个重复的列:
select([users.c.id, users.c.id])
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])中运行了等效的查询,这两个查询都正确地返回了重复的id。我正在使用SQLAlchemy版本0.8.0b2,Python3.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
您的列中至少有一个需要标签来在两者之间建立区分。
print(list(conn.execute(select([users.c.id, users.c.id.label('id2')]))))