我有三个用于不同付款类型的表,并且想创建一个表来保存使用所有这三个付款的表。我不确定我是否以正确的方式进行此操作,但我打算在表中为这三个列中的每一个创建一个外键列,并编写一个约束,使得这些列中的一个必须是不为空。
这是解决这个问题的正确方法吗?
你如何编写这个约束?
有什么办法可以从 SQLAlchemy 上的 sqlite 中做到这一点?(声明性类的代码将不胜感激)
我有三个用于不同付款类型的表,并且想创建一个表来保存使用所有这三个付款的表。我不确定我是否以正确的方式进行此操作,但我打算在表中为这三个列中的每一个创建一个外键列,并编写一个约束,使得这些列中的一个必须是不为空。
这是解决这个问题的正确方法吗?
你如何编写这个约束?
有什么办法可以从 SQLAlchemy 上的 sqlite 中做到这一点?(声明性类的代码将不胜感激)
有一个外键列和一个单独的type
列,以便您知道要查看哪个表。
好的,我知道了 - 这是最好的方法吗?- 我创建了一个通用 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
#
(其中concrete
和do_unique_index
设置相关的__mapper_args__
和__table_args__
)。然后我将枚举值的描述字段设置PaymentType
为这些类中的每一个,以便查找付款我可以查询一个 PaymentDetails
对象,然后从中获取一个 id 和一个类型,比如id
and Paypal
,以执行第二个查询具有该Paypal
ID 的。
我添加详细信息集的代码非常简单,在单个事务中,它将下一个逻辑 id 添加到PaymentDetails
表中,其中包含我们尝试创建的付款详细信息的类型,然后在该表中添加一个包含详细信息的条目我想进入。然后,我可以向这些 ORM 类添加方法,以处理我们为每种方法处理购买、销售和退款的不同方式,以便将它们视为相同。
然后,您需要如 van 所述打开 FK 约束- 我通过将 FK 侦听器添加到我用于 DB 访问的帮助程序类来实现。