1

支払いの種類ごとに 3 つのテーブルがあり、3 つすべてを使用して行われた支払いを保持するテーブルを作成したいと考えています。これを正しい方法で行っているかどうかはわかりませんが、3 つのそれぞれについてテーブルに外部キー列を作成し、それらの列の 1 つだけが必要になるように制約を作成するつもりでした。ヌルではありません。

  1. これはこれについて正しい方法ですか?

  2. この制約をどのように記述しますか?

  3. sqlite の SQLAlchemy 内からこれを行う方法はありますか? (宣言型クラスのコードは大歓迎です)

4

2 に答える 2

1

私はそれを持っています-これはそれを行うための最良の方法ですか?-汎用IDフィールドテーブルを次のように作成しました。

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

ここで、宣言型列挙型レシピPaymentTypeを使用し、さまざまな支払い方法でこれをサブクラス化します。

@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設定します)。次に、列挙値の説明フィールドをこれらの各クラスに設定します。これにより、支払いを検索するために オブジェクトをクエリし、そこからIDとタイプを取得して、次の2番目のクエリを実行できます。そのIDを持つ。__mapper_args____table_args__PaymentTypePaymentDetailsidPaypalPaypal

詳細のセットを追加するための私のコードは、単一のトランザクションで、PaymentDetails作成しようとしている支払いの詳細のタイプを含む次の論理IDをテーブルに追加し、次に詳細を含むエントリをそのテーブルに追加するという点で非常に単純です。入りたいです。次に、これらのORMクラスにメソッドを追加して、各メソッドの購入、販売、および払い戻しを処理するさまざまな方法を処理し、それらを同一として扱うことができるようにします。

次に、vanが述べたように、FK制約をオンにする必要があります。これは、DBアクセスに使用するヘルパークラスにFKリスナーを追加することによって行いました。

于 2012-06-27T17:32:17.053 に答える
1

単一の外部キー列と別のtype列を用意して、どのテーブルを調べるかがわかるようにします。

于 2012-06-27T15:38:22.417 に答える