如何使用SQLAlchemy核心选择postgresql中除1个特定列以外的所有表列?

时间:2018-01-09 04:59:41

标签: python postgresql sqlalchemy

我主要使用带有flask(0.12)的SQLAlchemy核心(v.1.0.8)表达式语言来创建API调用。对于表有20列的特定情况,我希望选择除1个特定列之外的所有列。如何在'select'子句中完成?是否有类似'except'的东西可以用来代替按名称明确选择列?

2 个答案:

答案 0 :(得分:1)

通常,您会明确命名所有想要的列,省略数据集中不需要的列。

stmt = sa.select([MyTable.col1, MyTable.col2, ...])

请注意,select对象接受一个列表。所以,在这里可以使用带有if条件的列表理解来获得与相同的效果,除了

filt_out = 'col_name_not_wanted'

stmt = sa.select([col for col in MyTable.__table__.columns if col.key != filt_out])

过滤条件甚至可以是另一个函数,因此您可以拥有更复杂的逻辑。

示例:

def filt(col):
    if col.index:
        return col.primary_key is True
    elif 'secret' in col.key:
        return False
    else:
        return True

stmt = sa.select([col for col in MyTable.__table__.columns if filt(col)])

上面的代码段假定MyTable是sqlalchemy声明映射。如果您有sqlalchemy表,请将MyTable.__table__替换为Mytable

这是一个完整的例子:

import sqlalchemy as sa
import sqlalchemy.ext.declarative as dec

b = dec.declarative_base()

class M(b):
    __tablename__ = 'm'
    id = sa.Column(sa.Integer, primary_key=True)
    col1 = sa.Column(sa.Integer)

stmt = sa.select([col for col in M.__table__.columns if col.key != 'col1'])
print(stmt)
# prints:
SELECT m.id 
FROM m

答案 1 :(得分:0)

你可以做一些聪明的回顾并做到这一点,但为什么不选择所有并忽略你不需要的那个呢?