Python sqlalchemy внутреннее соединение - PullRequest
0 голосов
/ 10 октября 2019

В sqlite я использую следующее, чтобы создать и подать в таблицу 'my_nutrition_results'

c.execute('''CREATE TABLE my_nutrition_results
             (date, item, qnt, var1, var2, var3)''')
sql = """INSERT INTO my_nutrition_results
                     ( date, item, qnt, var1, var2, var3)
         SELECT
                     t.date, t.item, t.qnt,
                     s.var1 * t.qnt, s.var2 * t.qnt, s.var3 * t.qnt
         FROM        eat_log              t
         INNER JOIN  nutritional_values   s
         ON          t.item = s.item;"""
c.execute(sql)

как мне сделать это ВНУТРЕННЕЕ СОЕДИНЕНИЕ в sqlalchemy, мой код sqlalchemy

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, FLOAT, DATE, ForeignKey
from sqlalchemy.orm import scoped_session, sessionmaker, relationship
import datetime as dt

engine = create_engine('sqlite:///test2.db', echo=True)
Session = sessionmaker(bind=engine)
Base = declarative_base()

class Nutritional_Values(Base):
    __tablename__ = 'nutritional_values'
    id = Column(Integer, primary_key=True)
    item = Column(String)
    var1 = Column(FLOAT)
    var2 = Column(FLOAT)
    var3 = Column(FLOAT)

    def __repr__(self):
        return "<Nutrional Value(item='%s', var1='%s', var2='%s' var3='%s')>" % (
                             self.item, self.var1, self.var2, self.var3)

Base.metadata.create_all(engine)

class Eat_Log(Base):
    __tablename__ = 'eat_log'
    id = Column(Integer, primary_key=True)
    date = Column(DATE)
    item = Column(String)
    qnt = Column(FLOAT)
    nutritional_value_id = Column(Integer,
                     ForeignKey('nutritional_values.id'),
                     nullable=False)

    # Relationships
    item_nutritional_value = relationship("Nutritional_Values")

    def __repr__(self):
        return "<Eat log(date='%s', item='%s', quantity='%s')>" % (
                             self.date, self.item, self.qnt)

Base.metadata.create_all(engine)

class My_Nutrition_Results(Base):
    __tablename__ = 'my_nutrition_results'
    id = Column(Integer, primary_key=True)
    date = Column(DATE)
    item = Column(String)
    qnt = Column(FLOAT)
    var1 = Column(FLOAT)
    var2 = Column(FLOAT)
    var3 = Column(FLOAT)
    nutritional_value_id = Column(Integer,
                     ForeignKey('nutritional_values.id'),
                     nullable=False)

    # Relationships
    item_nutritional_value = relationship("Nutritional_Values")

    def __repr__(self):
        return "<Nutrition Result(date='%s', item='%s', quantity='%s', var1='%s', var2='%s' var3='%s')>" % (
                             self.date, self.item, self.qnt, self.var1, self.var2, self.var3)

Base.metadata.create_all(engine)


s = Session()
objects = [
    Nutritional_Values(item="item1", var1=3, var2=4, var3=2),
    Nutritional_Values(item="item2", var1=4, var2=2, var3=8),
    Eat_Log(date=dt.date(2019, 9, 7),    item="item1",  qnt=2.0, nutritional_value_id=1 ),
    Eat_Log(date=dt.date(2019, 9, 7),    item="item2",  qnt=0.1, nutritional_value_id=2 ),
    Eat_Log(date=dt.date(2019, 9, 8),    item="item1",  qnt=3.0, nutritional_value_id=1 )
]
s.bulk_save_objects(objects)
s.commit()

из другого вопроса похоже, что мне нужно что-то вроде

s.query(Nutritional_Values.id, Eat_Log.id))
        .join(Eat_Log, Nutritional_Values.id == Eat_Log.nutritional_value_id)

но верно? и как мне сделать умножение между «QNT» и «VAR»? и как мне 'INSERT INTO' my_nutrition_results?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...