Присоединяйтесь при условии быстрой загрузки в sqlalchemy ormPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Присоединяйтесь при условии быстрой загрузки в sqlalchemy orm

Сообщение Anonymous »

Код: Выделить всё

from sqlalchemy.orm import subqueryload, joinedload, eagerload
from sqlalchemy import Column, DateTime, String, Integer, ForeignKey, func,Float, sql
from sqlalchemy.orm import relation
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine('sqlite:///testdb.sqlite', echo=True)

session = sessionmaker()
session.configure(bind=engine)

Base = declarative_base()
Base.metadata.create_all(engine)

s= session()

class Stock(Base):
__tablename__ = 'stock'

stock_id = Column(Integer, primary_key=True)
name = Column(String)
prices = relation("StockPrice")

class StockPrice(Base):
__tablename__ = 'stock_price'

stock_id = Column(Integer, ForeignKey('stock.stock_id'), primary_key=True)
date = Column(String, primary_key=True)
price = Column(Float)
source = Column(String, primary_key=True)
user = Column(String)

Base.metadata.create_all(engine)

stockprice1 = StockPrice(stock_id = 1, date="2014-10-29", price="170.0", source="X Firm", user="U1")
stockprice2 = StockPrice(stock_id = 1, date="2014-10-30", price="175.0", source="X Firm", user="U2")
stock1 = Stock(stock_id = 1, name = "GOOGLE", prices=[stockprice1, stockprice2])

stockprice1 = StockPrice(stock_id = 2, date="2014-10-29", price="150.0", source="X Firm", user="U1")
stockprice2 = StockPrice(stock_id = 2, date="2014-10-30", price="155.0", source="X Firm", user="U2")
stock2 = Stock(stock_id = 2, name = "YAHOO", prices=[stockprice1, stockprice2])

s.add_all([stock1, stock2])
s.commit()
Спешная загрузка цены на акцию:

Код: Выделить всё

stock = s.query(Stock).options(joinedload(Stock.prices)).filter(Stock.stock_id == 1).one()
Один из способов оперативно загрузить цену акции на определенную дату:

Код: Выделить всё

stock = s.query(Stock).options(joinedload(Stock.prices)).filter(Stock.stock_id == 1).filter(StockPrice.date == "2014-10-30").one()
Но проблема с этим подходом заключается в том, что если у вас есть такие таблицы, как StockPrice, связанные со Stock, и если вы хотите загрузить все отношения для заданной даты, тогда набор результатов станет очень огромный после объединения всех отношений. Фильтр добавляет условия в предложение WHERE, вместо этого мне нужен способ указать условие при соединении для быстрой загрузки.

Код: Выделить всё

stock = s.query(Stock).options(joinedload(Stock.prices, #condition does not work here)).filter(Stock.stock_id == 1).one()


Подробнее здесь: https://stackoverflow.com/questions/267 ... lchemy-orm
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»