如何在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。

这里缺少一些细节,包括Table元数据和/或声明性配置,以及我们是在讨论直接使用的核心insert()构造还是使用ORM。简而言之,SQLAlchemy仅在INSERT语句中为您提供值的列提供值,这些列可以在传递的参数中提供值,也可以在Column对象上配置为Python或sql端默认值。

如果不提供任何值,并且Column没有配置为具有sqlalchemy触发的默认值,则该列将不在INSERT语句的VALUES子句中。这个一般的思想适用于核心insert()构造。

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

最新更新