1

在问如何之前,我可能会先问是否可能。

那么,是否可以在 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。

4

1 回答 1

0

这里缺少细节,包括表元数据和/或声明性配置,以及我们是在谈论直接使用的核心 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

于 2012-12-21T05:30:47.370 回答