Выберите определенные столбцы из таблицы в SQLAlchemy

Я пытаюсь выбрать определенные столбцы из таблицы следующим образом:

users = Table('users', metadata, autoload=True)
s = users.select([users.c.email])
results = s.execute()
print results

и я получаю эту ошибку:

> Traceback (most recent call last): File "my_mailer.py", line 35, in
> <module>
> s = users.select([users.c.email]) File "/task/__pips__/sqlalchemy/sql/selectable.py", line 175, in select
> return Select([self], whereclause, **params) File "/task/__pips__/sqlalchemy/sql/selectable.py", line 2082, in __init__
> self._whereclause = _literal_as_text(whereclause) File "/task/__pips__/sqlalchemy/sql/elements.py", line 2745, in
> _literal_as_text
> "SQL expression object or string expected." sqlalchemy.exc.ArgumentError: SQL expression object or string
> expected.
</module>

Итак, я пробовал это:

users = Table('users', metadata, autoload=True)
s = users.select('email')
results = s.execute()
print results

И получил это в ответ:

> Traceback (most recent call last): File "my_mailer.py", line 36, in
> <module>
> results = s.execute() File "/task/__pips__/sqlalchemy/sql/base.py", line 124, in execute
> return e._execute_clauseelement(self, multiparams, params) File "/task/__pips__/sqlalchemy/engine/base.py", line 1605, in
> _execute_clauseelement
> return connection._execute_clauseelement(elem, multiparams, params) File "/task/__pips__/sqlalchemy/engine/base.py", line 761,
> in _execute_clauseelement
> compiled_sql, distilled_params File "/task/__pips__/sqlalchemy/engine/base.py", line 874, in
> _execute_context
> context) File "/task/__pips__/sqlalchemy/engine/base.py", line 1023, in _handle_dbapi_exception
> exc_info File "/task/__pips__/sqlalchemy/util/compat.py", line 185, in raise_from_cause
> reraise(type(exception), exception, tb=exc_tb) File "/task/__pips__/sqlalchemy/engine/base.py", line 867, in
> _execute_context
> context) File "/task/__pips__/sqlalchemy/engine/default.py", line 388, in do_execute
> cursor.execute(statement, parameters) sqlalchemy.exc.ProgrammingError: (ProgrammingError) argument of WHERE
> must be type boolean, not type character varying LINE 3: WHERE email
</module>

Конечно, первым аргументом здесь является "whereclause", а не "столбцы", как и везде, это отражено в документации:

Этот аргумент отсутствует в форме select(), доступной на Таблица.

Вопрос:, как я могу выбрать только определенные столбцы, используя select в таблице? И вообще, почему на земле аргумент столбцов недоступен при выборе на столе? Я не понимаю, почему кто-то принял решение сделать это иначе, чем стандартный выбор.

2 ответа

Использовать общие цели select вместо Table.select:

stmt = select([users.c.email])
result = conn.execute(stmt)


С помощью метаданных вы можете сделать это:

metadata = MetaData(bind=engine)
tblusers = metadata.tables['users']
tblproducts = metadata.tables['products']
# example 1: only columns you want.
data_users = tblusers.select().with_only_columns([tblusers.c.id, tblusers.c.name]).execute()
# example 2: w/ where & order_by
data_products = tblproducts.select().with_only_columns([tblproducts.c.id, tblproducts.c.price, tblproductos.c.description]).where(tblproducts.c.stock > 0).order_by(tblproducts.c.brand).execute()

Хорошо...

Документы SqlAlchemy

licensed under cc by-sa 3.0 with attribution.