1

方法を尋ねる前に、私は最初にそれが可能かどうか尋ねるかもしれません。

では、SQLAlchemyで、実際にマップされているテーブルのすべての列のうち、テーブルの一部の列のみを永続化することは可能ですか?

実際、私のテーブルには、データベースによって計算される1つの列があり、データベースユーザーが変更することはできません。私は実際にそうする特権を取り消しました。

私の問題は、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

Tableメタデータや宣言型構成、コアのinsert()構造が直接使用されているのか、ORMを使用しているのかなど、ここには詳細がありません。簡単に言うと、SQLAlchemyは、渡されたパラメーター内で、またはColumnオブジェクトでPython側またはSQL側のデフォルトとして構成された値を提供する列に対して、INSERTステートメントでのみ値を提供します。

値を指定せず、列がSQLAlchemyで起動されるデフォルトを持つように構成されていない場合、列はINSERTステートメントのVALUES節に含まれません。この一般的な考え方は、コアのinsert()構造に適用されます。

INSERTを発行するためにinsert()構造を利用するORMは、マップされていると仮定すると、割り当てられていない列に値を提供することに少し熱心になる傾向があります。FetchedValueコンストラクトは、特定の列をフェッチしてその値を取得する必要があることをORMに示すために使用されます。http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html#triggered-columns

于 2012-12-21T05:30:47.370 に答える