22

私は宣言ベースのモデルを持っています:

class User(Base):
    id = Column(Integer, primary_key=True)
    money = Column(Integer, default=100)

そして、私は走ります

>>> u = User()
>>> u.money
None

データベースに何も書き込まずにsqlalchemy を使用してデフォルトを設定するにはどうすればよいですか?

4

3 に答える 3

20

列のデフォルトは INSERT および UPDATE ステートメントにのみ適用されるため.flush()、セッションが開始されるまで適用されません。

フラッシュする前に新しいインスタンスで同じ値を表示するには、新しいインスタンスの作成時にデフォルトを適用する必要があります。オブジェクトの__init__メソッドで:User

class User(Base):
    __tablename__ = 'users'

    def __init__(self, **kwargs):
        if 'money' not in kwargs:
             kwargs['money'] = self.__table__.c.money.default.arg
        super(User, self).__init__(**kwargs)

    id = Column(Integer, primary_key=True)
    money = Column(Integer, default=100)

属性が設定されていない場合moneyは、列に構成されたデフォルトに基づいて直接追加します。

デフォルトはPython 値ではなくSQL 式であることに注意してください。そのため、最初にそれらを Python オブジェクトにマッピングする必要がある場合があります。たとえば、ブール フィールドには、またはPython ブール オブジェクトではなく、デフォルト値'false'または'true'文字列値があります。FalseTrue

于 2012-12-09T21:03:52.177 に答える