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

Posted

技术标签:

【中文标题】如何使用 SQLAlchemy 核心选择除 postgresql 中的 1 个特定列之外的所有表列?【英文标题】:How to use SQLAlchemy core to select all table columns except 1 specific column in postgresql? 【发布时间】:2018-01-09 04:59:41 【问题描述】:

我主要使用带有flask(0.12) 的SQLAlchemy core(v.1.0.8) 表达式语言来创建API 调用。对于表有 20 列的特殊情况,我希望选择除 1 个特定列之外的所有列。如何在“选择”子句中做到这一点?是否可以使用“except”之类的东西来代替按名称显式选择列?

【问题讨论】:

我认为 Postgres 或 SQL 通常不支持这一点。但从性能的角度来看,只执行select * 然后在表示层中过滤掉一列并没有错。 【参考方案1】:

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

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

请注意,选择对象接受一个列表。因此,这里可以使用带有 if 条件的列表推导来获得与 except 相同的效果:

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)])

上面的 sn-p 假设 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

【讨论】:

【参考方案2】:

你可以做一些巧妙的回顾,但为什么不直接选择所有并忽略你不需要的呢?

【讨论】:

忽略 1 的语法是什么?没找到

以上是关于如何使用 SQLAlchemy 核心选择除 postgresql 中的 1 个特定列之外的所有表列?的主要内容,如果未能解决你的问题,请参考以下文章

使用核心 SQLAlchemy 插入和更新

用 sqlalchemy 查询敲除填充表

使用 sqlalchemy 时如何选择特定列?

SQLAlchemy:如何根据其后端有条件地选择列的类型

如何使用 SQLAlchemy from_select 插入到选择中?

python 使用sqlalchemy核心的SQL查询