【问题标题】:How to persist only a subset of the mapped columns on SQLAlchemy?如何仅保留 SQLAlchemy 上映射列的子集?
【发布时间】:2012-12-20 17:09:53
【问题描述】:

在问怎么做之前,我可能会先问是否可能。

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

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

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

    【讨论】:

    • 我的配置文件:_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。无论如何,FetchedValue 构造正是我想要的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多