在问怎么做之前,我可能会先问一下是否有可能。
那么,是否有可能在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