在sqlalchemy中,我可以在union中添加一个名为“source table”的列吗?

m4pnthwp  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(372)

我有这两张table——销售和采购。然后是与他们相关的“股票”。顺便说一下,这是炼金术,但我不知道这是否重要。

class Sales(db.Model):
    __tablename__ = "sales"
    id = db.Column(db.Integer, primary_key=True)
    stock_id = db.Column(db.Integer, db.ForeignKey(
        'stocks.id'), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    amount = db.Column(db.Integer, nullable=False, default=1)
    unit_price = db.Column(db.Numeric, nullable=False)
    total_price = db.Column(db.Numeric, nullable=False)
    time = db.Column(db.DateTime, nullable=False,
                     default=datetime.datetime.utcnow())

class Purchases(db.Model):
    __tablename__ = "purchases"
    id = db.Column(db.Integer, primary_key=True)
    stock_id = db.Column(db.Integer, db.ForeignKey(
        'stocks.id'), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    amount = db.Column(db.Integer, nullable=False, default=1)
    unit_price = db.Column(db.Numeric, nullable=False)
    total_price = db.Column(db.Numeric, nullable=False)
    time = db.Column(db.DateTime, nullable=False,
                     default=datetime.datetime.utcnow())

class Stock(db.Model):
    __tablename__ = "stocks"
    id = db.Column(db.Integer, primary_key=True)
    symbol = db.Column(db.String(), nullable=False, unique=True)
    name = db.Column(db.String, nullable=False)

我需要对整个交易做一个概述(然后将其与stock表连接起来,以便能够看到正在销售/购买的产品的名称)
这两张table是一样的。唯一的区别是一个是销售,一个是采购。我需要在查询产生的数据中明确这一点——哪些行来自“销售”,哪些行来自“采购”
用一个表来代替所有事务和一个列来指定从一开始是销售还是购买会更聪明吗?或者用正数和负数来表示“价格合计”?
我可以将两个表合并,但也可以指定哪些行来自哪个表吗?比如添加一个额外的列,如果是销售,内容是“0”,如果是购买,内容是“1”?
如果有人能给我展示一些示例查询,包括如何使连接也包含来自stock表的“stock symbol”或“stock name”,我将不胜感激。

yrwegjxp

yrwegjxp1#

你可以用 label 功能与 text 函数创建“source”列。

from sqlalchemy.sql import text

q1 = db.session.\
    query(
        text("Purchases").label("SourceTable"),
        Purchases.stock_id.label("PurchaseStockId")
        Stock.id.label("StockId")).\
    join(
        Purchases,
        Purchases.stock_id == Stock.id)

q2= db.session.\
    query(
        text("Sales").label("SourceTable"),
        Sales.stock_id.label("SalesStockId"),
        Stock.id.label("StockId")).\
    join(
        Sales,
        Sales.stock_id == Stock.id)

q3 = q1.union(q2).all()

相关问题