в Sqlalchemy я могу добавить столбец с именем «исходной таблицы» в объединение? - PullRequest
1 голос
/ 28 мая 2020

У меня есть эти две таблицы - продажи и покупки. А потом "сток", который к ним относится. Это, кстати, Flask -Sqlalchemy, но я не знаю, важно ли это.

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, чтобы увидеть название продукта, который продается / покупается)

Эти две таблицы идентичны. Единственная разница в том, что один - это продажи, а другой - покупки. И мне нужно прояснить это в данных, полученных в результате запроса: какие строки относятся к «продажам», а какие - к «покупкам»?

  1. Было бы разумнее создать одну таблицу вместо этого со всеми транзакциями и столбцом для указания, была ли это покупка или продажа с самого начала? Или использовать положительные и отрицательные числа для «итоговой цены»?

  2. Могу ли я объединить две таблицы, но каким-то образом указать, какие строки из какой таблицы? Например, добавление дополнительного столбца с содержанием «0», если это продажа, и «1», если это покупка?

  3. Если бы кто-нибудь показал мне несколько примеров запросов, в том числе как сделать я был бы очень признателен за объединение, чтобы включить "символ акции" или "название акции" из таблицы акций.

1 Ответ

0 голосов
/ 29 мая 2020

Вы можете использовать функцию label вместе с функцией text, чтобы создать «исходный» столбец.

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()
...