如何在SQLAlchemy上仅保留映射列的子集?

时间:2012-12-20 17:09:54

标签: sqlalchemy

在询问之前,我可能先问是否有可能。

那么,在SQLAlchemy上,是否可以在表的所有列中仅保留表的某些列?

实际上,在我的表中,我有一列由数据库计算,不应由数据库用户修改。我实际上撤销了这样做的特权。

我的问题是SQLAlchemy正在尝试在每个列上插入值:

INSERT INTO mytable(data_1,data_2,...,data_n,computed_data)VALUES ......

相反,我希望它能做到这一点:

INSERT INTO mytable(data_1,data_2,...,data_n)VALUES ...

有人知道是否有可能吗?如果是,如何配置此行为?

由于

2012-12-21:修改

这是我的配置:

_mytable = Table('mytable', Base.metadata,
    Column('id', Integer, primary_key=True),
    Column('somedata', String),
    Column('protecteddata', String),
)

class MyObject(Base):
    __table__ = _mytable
    _id = _mytable.c.id

    def __init__(self, somedata):
        self.somedata = somedata

我在谈论使用ORM的INSERT。当我没有为'protecteddata'提供任何值时,SQLAlchemy似乎在我提交时为我的'protecteddata'提供None。

1 个答案:

答案 0 :(得分:0)

这里缺少详细信息,包括Table元数据和/或声明性配置,以及我们是否正在讨论直接使用的核心insert()构造或我们正在使用ORM。简短的回答是SQLAlchemy仅在INSERT语句中为您提供值的列提供值,无论是在传递的参数内,还是在Column对象上配置为Python或SQL端的默认值。

如果未提供任何值,并且未将列配置为具有SQLAlchemy触发的默认值,则该列将不在INSERT语句的VALUES子句中。这个一般概念适用于core insert()构造。

ORM本身利用insert()构造来发出INSERT,它确实更倾向于为未被分配的Column提供值,假设它被映射。 FetchedValue构造用于向ORM指示应该获取特定列以获取其值:http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html#triggered-columns