正好约束一列不为空

时间:2012-06-27 15:36:19

标签: sqlite sqlalchemy

我有三个表用于不同的付款类型,并希望创建一个表格来保存使用这三种付款方式。我不确定我是否以正确的方式进行此操作,但我打算在表中为这三个中的每一个创建一个外键列,并编写一个约束,使得这些列中的一个必须是不是空的。

  1. 这是解决这个问题的正确方法吗?

  2. 你如何写这个约束?

  3. 有没有办法在sqlite上的SQLAlchemy中执行此操作? (非常感谢声明性类的代码)

2 个答案:

答案 0 :(得分:1)

只有一个外键列和一个单独的type列,以便您知道要查看哪个表。

答案 1 :(得分:1)

好的我已经知道了 - 这是最好的方法吗? - 我创建了一个通用的id字段表:

class PaymentDetails(Base):
    __tablename__ = 'payment_details'
    id = Column(Integer, primary_key=True)
    type = Column(PaymentType.db_type(), nullable=False)

其中PaymentType使用declarative enum recipe,然后将其子类化为各种付款方式:

@concrete
@do_unique_index('paypal_unique_details', 'env', 'main_email', 'sub_email')
class Paypal(Base):
    __tablename__ = 'paypal_details'
    id = Column(ForeignKey('payment_details.id'), primary_key=True)
    # The rest of the implementation
    #
@concrete
@do_unique_index('credit_card_unique_details', 'env', 'card_number')
class CreditCard(Base):
    __tablename__ = 'card_details'
    id = Column(ForeignKey('payment_details.id'), primary_key=True)
    # The rest of the implementation
    #
@concrete
@do_unique_index('time_code_unique_details', 'env', 'code')
class TimeCodes(Base):
    __tablename__ = 'code_details'
    id = Column(ForeignKey('payment_details.id'), primary_key=True)
    # The rest of the implementation
    #

concretedo_unique_index设置相关的__mapper_args____table_args__。然后我将PaymentType枚举值的描述​​字段设置为这些类中的每一个,以便查找付款我可以查询PaymentDetails对象,然后从中获取id和类型,例如idPaypal,对具有该ID的Paypal执行第二次查询。

我添加细节集的代码相当简单,因为在单个事务中,它会将PaymentDetails表的下一个逻辑ID添加到我们尝试创建的付款详细信息的类型中,然后添加包含我要输入的详细信息的表格。然后,我可以为这些ORM类添加方法,以处理我们为每种方法处理购买,销售和退款的不同方式,以便将它们视为相同。

然后你需要打开FK约束as van mentioned - 我这样做是通过将FK监听器添加到我用于数据库访问的帮助程序类。