Source code for koapy.utils.store.sqlalchemy.Snapshot

from sqlalchemy import Column, ForeignKey, Integer, String, UniqueConstraint
from sqlalchemy.orm import object_session, relationship
from sqlalchemy.sql.functions import current_timestamp

from .Base import Base
from .SnapshotAssociation import SnapshotAssociation
from .Symbol import Symbol
from .Timestamp import Timestamp
from .Version import Version


[docs]class Snapshot(Base): __tablename__ = "snapshots"
[docs] id = Column(Integer, primary_key=True)
[docs] name = Column(String, index=True, nullable=False)
[docs] timestamp = Column(Timestamp(timezone=True), server_default=current_timestamp())
[docs] library_id = Column(Integer, ForeignKey("libraries.id"), nullable=False)
[docs] library = relationship("Library", back_populates="snapshots")
[docs] versions = relationship("SnapshotAssociation", back_populates="snapshot")
__table_args__ = (UniqueConstraint("library_id", "name"),)
[docs] def get_symbols(self): session = object_session(self) associations = session.query(SnapshotAssociation).with_parent(self) versions = session.query(Version).join(associations.subquery()) symbols = session.query(Symbol).join(versions.subquery()) symbols = symbols.all() return symbols
[docs] def get_versions(self): session = object_session(self) associations = session.query(SnapshotAssociation).with_parent(self) versions = session.query(Version).join(associations.subquery()) versions = versions.all() return versions
[docs] def get_version_of_symbol(self, symbol): session = object_session(self) if isinstance(symbol, str): symbol = ( session.query(Symbol) .filter(Symbol.library_id == self.library_id and Symbol.name == symbol) .one() ) associations = session.query(SnapshotAssociation).with_parent(self) version = ( session.query(Version) .with_parent(symbol) .join(associations.subquery()) .one() ) return version
[docs] def delete(self): session = object_session(self) associations = session.query(SnapshotAssociation).with_parent(self) associations.delete() session.delete(self)