在询问之前,我可能先问是否有可能。
那么,在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。
答案 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