sqlalchemyを使用して単一のテーブルを生成するために、結合を使用して複数の関連テーブルをクエリする

コウモリ

在庫システムを管理し、本や商品を販売するウェブアプリに取り組んでいます。特定の期間に在庫に販売および注文された本の数に関する月次ベースのレポートを生成したいと思います。これを行うには、いくつかのテーブルを結合する必要があります。これが私のテーブルです:-Bookテーブル

class Book(ResourceMixin, db.Model):

    __tablename__ = 'book'

    id = db.Column(db.Integer, primary_key=True)

    title = db.Column(db.String(85))
    stock_amount = db.Column(db.Integer, nullable=False, server_default='0')

    #Foreign Key
    category_id = db.Column(db.Integer, db.ForeignKey('category.id',
                                                    onupdate='CASCADE',
                                                    ondelete='CASCADE'),
                        index=True, nullable=False)
  • カテゴリ表
class Category(ResourceMixin, db.Model):

    __tablename__ = 'category'

    id = db.Column(db.Integer, primary_key=True)
    category_name = db.Column(db.String(85))
    isbn1 = db.Column(db.String(13))
    isbn2 = db.Column(db.String(13))
    total_stock_amount = db.Column(db.Integer)
    unit_price = db.Column(db.Float)
    selling_price = db.Column(db.Float)
    bank_transfer_price = db.Column(db.Float)
    unit_cost = db.Column(db.Float)
    author = db.Column(db.String(100))


    ordered = db.Column('is_ordered', db.Boolean(), nullable=False, server_default='0')

    #Association Proxies

    orders = association_proxy('book_orders', 'order')
    stores = association_proxy('book_store', 'store')

    supplier_id = db.Column(db.Integer, db.ForeignKey('suppliers.id',
                                                    onupdate='CASCADE',
                                                    ondelete='CASCADE'),
                        index=True, nullable=False)

    #Relationship with Books

    books = db.relationship(Book, backref=db.backref('book_category'), innerjoin=True)
  • BookStoreテーブルから継承するCategoryテーブル

class BookStore(ResourceMixin, db.Model):

    __tablename__ = 'book_store'

    id = db.Column(db.Integer, primary_key=True)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'))
    isbn1 = db.Column(db.String)
    isbn2 = db.Column(db.String)
    book_amount = db.Column(db.Integer)



    #Bidirectional attribute/collection of 'category'/'book_store'

    category = db.relationship('Category', backref = db.backref('book_store', cascade='all, delete-orphan'),
                            lazy='joined', innerjoin=True,
                            order_by='Category.category_name')


    bookstore_cart = db.relationship('StoreCart', backref='book_store_cart', passive_deletes=True)

    book_purchases = association_proxy('book_orders', 'customer_purchases')

    #Reference to the 'Store' object

    store = db.relationship('Store')
  • CustomerPurchase から継承するテーブル BookStore
class CustomerPurchase(ResourceMixin, db.Model):

    __tablename__ = 'customer_purchase'

    id = db.Column(db.Integer, primary_key=True)

    book_store_category_id = db.Column(db.Integer, db.ForeignKey('book_store.id'))
    customer_order_id = db.Column(db.Integer, db.ForeignKey('customer_orders.id'))

    book_title = db.Column(db.Text)
    unit_price = db.Column(db.Float)
    quantity = db.Column(db.Float) 
    total_price = db.Column(db.Float)

    store_id = db.Column(db.Integer, db.ForeignKey('store.id',
                                                    onupdate='CASCADE',
                                                    ondelete='CASCADE'),
                        index=True)

    #Bidirectional attribute/collection of 'bookstore'/'customer purchase'

    book_purchase = db.relationship('BookStore', backref = db.backref('customer_purchases', cascade='all, delete-orphan'),
                            lazy='joined', innerjoin=True,
                            order_by='BookStore.isbn1')

    #Bidirectional attribute/collection of 'store'/'purchase'

    customer_order = db.relationship('CustomerOrders')

動作原理を説明しましょう。したがって、本を販売するには、ユーザーはに転送Categoryする必要がBookStoreあり、それから彼/彼はそれを販売することができます。売上はCustomerPurchaseテーブルに保存されます。在庫の本が完成した場合、ユーザーはサプライヤーに本を注文して在庫に入れる必要があります。将来のレポートを生成するために、在庫への入力の日付が取得されます。

希望するレポートテーブルには、これらの列を含める必要があります

   book_title | unit_cost | amount_in_stock | revenue | amount_ordered | total_price_of_ordered_books | amount_sold | revenue | amount_left | total_price_of_amount_left | 

私の質問は:

bp = db.session.query(CustomerPurchase.book_store_category_id, BookStore.category, func.sum(CustomerPurchase.quantity).label('quantity'))\
     .filter(CustomerPurchase.created_on >= start_date)\
     .filter(CustomerPurchase.created_on <= end_date)\
     .group_by(CustomerPurchase.book_store_category_id, BookStore.id, Category.id)\
     .subquery()


cp = db.session.query(BookStore, bp.c.quantity)\
                     .join(bp, BookStore.category_id == bp.c.book_store_category_id)\
                     .distinct(bp.c.book_store_category_id)\
                     .order_by(bp.c.book_store_category_id)\
                     .all()

これは、出力CustomerPurchaseBookStoreテーブルをが、私がダウンして行くことはできません例えば、それを超えませんCustomerPurchase.book_purchase.category.books.stock_amountか、BookStore.category.books.stock_amount

CustomerPurchase.book_purchaseにアクセスしようとすると、エラーがスローされます UndefinedError: 'sqlalchemy.util._collections.result object' has no attribute 'book_purchase'

どんな助けでも大歓迎です!前もって感謝します!

コウモリ

2週間の研究とコラボレーションの後、私はなんとか問題を解決することができました。

これで、必要なすべての列が出力され、列がNULLであっても戻ります。

my_query = db.session.query(CustomerPurchase.book_title, Category.unit_cost, Category.total_stock_amount, BookStore.book_amount,
                    func.sum(CustomerPurchase.quantity).label('quantity'),
                    func.sum(Book.stock_amount).label('book_stock_amount'))\
                    .join(BookStore)\
                    .join(Category)\
                    .outerjoin(Book)\
                    .filter(CustomerPurchase.created_on >= report.start_date.date())\
                    .filter(CustomerPurchase.created_on <= report.end_date.date())\
                    .group_by(CustomerPurchase.book_title,
                            Category.unit_cost, Category.total_stock_amount,
                            BookStore.book_amount).all()

それと同じくらい簡単です!基本的に、表示したいすべての列をチェリーピックする必要があります。また、Book.stock_amountのNULL戻り値が心配でしたがouterjoinBookテーブルで使用た後、レポートに必要なすべてのデータを引き出すことができました。

私はそれがそこにいる何人かの人々のために役立つことを願っています!:)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    CSSのみを使用して三角形のアニメーションを作成する方法

  3. 3

    ZScalerと証明書の問題により、Dockerを使用できません

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    別のホストからTomcat Managerアプリにアクセスする

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Python / SciPyのピーク検出アルゴリズム

  9. 9

    MLでのデータ前処理の背後にある直感

  10. 10

    useRefに反応してコンポーネントをスクロールして表示する

  11. 11

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  12. 12

    パンダは異なる名前の列に追加します

  13. 13

    PictureBoxで画像のブレンドを無効にする

  14. 14

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  15. 15

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  16. 16

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  17. 17

    Material-UIでTextFieldエラーの色を条件付きでオーバーライドする方法

  18. 18

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  19. 19

    MatplotlibまたはSeabornを使用して、グループ化されたデータから複数のプロットを生成するにはどうすればよいですか?

  20. 20

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  21. 21

    Flutterにファイルピッカープラグインを追加するにはどうすればよいですか?

ホットタグ

アーカイブ