我有三个表用于不同的付款类型,并希望创建一个表格来保存使用这三种付款方式。我不确定我是否以正确的方式进行此操作,但我打算在表中为这三个中的每一个创建一个外键列,并编写一个约束,使得这些列中的一个必须是不是空的。
这是解决这个问题的正确方法吗?
你如何写这个约束?
有没有办法在sqlite上的SQLAlchemy中执行此操作? (非常感谢声明性类的代码)
答案 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
#
(concrete
和do_unique_index
设置相关的__mapper_args__
和__table_args__
。然后我将PaymentType
枚举值的描述字段设置为这些类中的每一个,以便查找付款我可以查询PaymentDetails
对象,然后从中获取id和类型,例如id
和Paypal
,对具有该ID的Paypal
执行第二次查询。
我添加细节集的代码相当简单,因为在单个事务中,它会将PaymentDetails
表的下一个逻辑ID添加到我们尝试创建的付款详细信息的类型中,然后添加包含我要输入的详细信息的表格。然后,我可以为这些ORM类添加方法,以处理我们为每种方法处理购买,销售和退款的不同方式,以便将它们视为相同。
然后你需要打开FK约束as van mentioned - 我这样做是通过将FK监听器添加到我用于数据库访问的帮助程序类。