0

나는 Plates가 Project를 외래 키로 가지고있는 Projects와 Plates에 대한 모델을 포함하고있는 Flask로 구축 할 앱이 있습니다.술병 sqlalchemy foreignkey 속성을 가진 UniqueConstraint

각 프로젝트에는 정수로 주어진 연도가 있습니다 (따라서 2017은 17입니다). 각 플레이트에는 번호판과 이름이 있으며, 플레이트 번호와 플레이트 번호로 구성됩니다. 예를 들어 올해 완료된 프로젝트의 '플레이트 106'은 '17 -0106 '이라는 이름을 갖습니다. 이 이름이 독창적 이길 바랍니다. 여기

내 모델입니다 : 나의 첫 생각이 같은 project.year 특성이 판 사이에 번호가 고유하게 만들기 위해, 그래서 내가 __table_args__ = (UniqueConstraint('project.year', 'number', name='_year_number_uc'),)에 변화를 시도했다, 그러나 이것은 필요
class Project(Model): 
    __tablename__ = 'projects' 
    id    = Column(Integer, primary_key=True) 
    name   = Column(String(64),unique=True) 
    year   = Column(Integer,default=datetime.now().year-2000) 

class Plate(Model): 
    __tablename__ = 'plates' 
    id    = Column(Integer, primary_key=True) 
    number   = Column(Integer) 
    project_id  = Column(Integer, ForeignKey('projects.id')) 
    project   = relationship('Project',backref=backref('plates',cascade='all, delete-orphan')) 

    @property 
    def name(self): 
     return str(self.project.year) + '-' + str(self.number).zfill(4) 

다른 테이블에 액세스하십시오.

데이터베이스에서이 작업을 수행 할 수있는 방법이 있습니까? 또는 숫자/project.year 조합 또는 이름 속성의 고유성을 검사하는 __init__ 메서드가 실패 했습니까?

답변

0

문제에는 여러 가지 해결책이 있습니다. 예를 들어, project.year-number 조합을 비 표준화하고 별도의 Plate 필드로 저장할 수 있습니다. 그런 다음 고유 한 키를 입력 할 수 있습니다. 문제는 어떻게 그 가치를 유지할 것인가입니다. 두 가지 확실한 옵션은 트리거입니다 (DB가 트리거를 지원한다고 가정하면 사용할 수 있습니다) 또는 sqla 이벤트 http://docs.sqlalchemy.org/en/latest/orm/events.html#

두 가지 솔루션 모두 추가 SELECT 쿼리를 생성하지 않습니다. 내가 믿는 것은 당신에게 중요합니다.

귀하의 질문은 다소 유사합니다 Can SQLAlchemy events be used to update a denormalized data cache?