【问题标题】:Select specific columns from table in SQLAlchemy从 SQLAlchemy 中的表中选择特定列
【发布时间】:2014-02-22 23:07:54
【问题描述】:

我正在尝试从这样的表中选择特定列:

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.

所以我尝试了这个:

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

果然,这里的第一个参数是'whereclause',而不是像其他地方一样的'columns',这反映在the documentation

此参数不存在于可用的 select() 形式上 表。

问题:如何在表格上使用 select 仅选择特定列?通常,为什么在 select 表上的列参数不可用?我不明白为什么有人决定让这个不同于标准的select

【问题讨论】:

    标签: python sql select sqlalchemy


    【解决方案1】:

    使用通用的select 而不是Table.select

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

    【讨论】:

    • 我知道我可以做到这一点,但你知道是否有任何方法可以对 table select 风味做同样的事情?在我看来,不能对表格选择做同样的事情会导致它有缺陷。
    • 阅读文档的第二个链接:它是明确的:不,你不能这样做。在某种程度上,table.select 只是一个语法糖。
    【解决方案2】:

    使用元数据,您可以这样做:

    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 Docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2022-01-03
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多