簡體   English   中英

一次寫入只讀字段

[英]Write-once read-only field

我們需要使用SQLAlchemy / Elixir實現一次寫入(在對象創建時)只讀字段。

一個快速而骯臟的解決方案:

class User(Entity):
    # some fields ...    
    _created    = Field(DateTime, default=datetime.utcnow)
    @property
    def created(self):
        return self._created

有沒有更好的方法(例如,使用插入前觸發器?)

可能有很多方法,但一個是使用@validates

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class A(Base):
    __tablename__ = 'a'

    id = Column(Integer, primary_key=True)

    readonly1 = Column(String)
    readonly2 = Column(String)


    @validates('readonly1', 'readonly2')
    def _write_once(self, key, value):
        existing = getattr(self, key)
        if existing is not None:
            raise ValueError("Field '%s' is write-once" % key)
        return value


a1 = A()
a1.readonly1 = 'foo'
assert a1.readonly1 == 'foo'

try:
    a1.readonly1 = 'bar'
    assert False
except ValueError, e:
    print e

e = create_engine("sqlite://")
Base.metadata.create_all(e)
s = Session(e)
s.add(A(readonly1='foo', readonly2='bar'))
s.commit()

a2 = s.query(A).first()

try:
    a2.readonly2 = 'bar2'
    assert False
except ValueError, e:
    print e

@validates只是使用屬性事件的簡寫,您可以使用它來構建其他設置方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM