1

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

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

  2. 你如何编写这个约束?

  3. 有什么办法可以从 SQLAlchemy 上的 sqlite 中做到这一点?(声明性类的代码将不胜感激)

4

2 回答 2

1

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

于 2012-06-27T15:38:22.417 回答
1

好的,我知道了 - 这是最好的方法吗?- 我创建了一个通用 id 字段表,如下所示:

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

wherePaymentType使用声明性枚举配方,然后将其子类化为各种付款方式:

@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 和一个类型,比如idand Paypal,以执行第二个查询具有该PaypalID 的。

我添加详细信息集的代码非常简单,在单个事务中,它将下一个逻辑 id 添加到PaymentDetails表中,其中包含我们尝试创建的付款详细信息的类型,然后在该表中添加一个包含详细信息的条目我想进入。然后,我可以向这些 ORM 类添加方法,以处理我们为每种方法处理购买、销售和退款的不同方式,以便将它们视为相同。

然后,您需要如 van 所述打开 FK 约束- 我通过将 FK 侦听器添加到我用于 DB 访问的帮助程序类来实现。

于 2012-06-27T17:32:17.053 回答