代码之家  ›  专栏  ›  技术社区  ›  Joril

带函数的复合唯一约束

  •  3
  • Joril  · 技术社区  · 16 年前

    我有一个属性为“Number”和“Date”的类“Document”。我需要确保没有重复的号码 当年 有没有办法对“数字+年份(日期)”进行唯一约束?我应该使用唯一索引吗?我如何声明功能部件?

    提前谢谢!

    2 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    14 年前

    应该使用函数唯一索引来应用此约束。不幸的是,SQLAlchemy中的数据库泛型独立于数据库的模式定义机制还没有抽象出函数索引。您必须使用DDL构造来注册自定义模式定义子句。如果使用声明性方法声明架构,请在类定义后添加以下内容:

    DDL(
        "CREATE UNIQUE INDEX doc_year_num_uniq ON %(fullname)s "
        "(EXTRACT(YEAR FROM date), number)"
    ).execute_at('after-create', Document.__table__)
    

    我成功使用的语法:

    from sqlalchemy import event
    
    event.listen(ModelObject.__table__,
             'after_create',
              DDL("CREATE UNIQUE INDEX term_year ON %(fullname)s "
                  "(EXTRACT(YEAR FROM start_date), term)",
                  on = 'postgresql'
                  )
             )
    
        2
  •  -1
  •   fucx    16 年前

    我非常确定,唯一约束只能应用于已经包含数据的列,而不能应用于运行时计算的表达式。因此,您需要创建一个额外的列,其中包含 year 你的一部分 date number . 为了最好地使用这种方法,也许您应该存储 分为三列,分别包含日、月和年部分。这可以使用表定义中的默认约束来完成。