mirror of
https://github.com/azaion/gps-denied-desktop.git
synced 2026-04-23 03:46:36 +00:00
initial structure implemented
docs -> _docs
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
from .connection import get_engine, get_session, init_db
|
||||
from .models import Base, FlightModel, FrameResultModel, ChunkModel, WaypointModel
|
||||
|
||||
__all__ = [
|
||||
"get_engine",
|
||||
"get_session",
|
||||
"init_db",
|
||||
"Base",
|
||||
"FlightModel",
|
||||
"FrameResultModel",
|
||||
"ChunkModel",
|
||||
"WaypointModel",
|
||||
]
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
from typing import AsyncGenerator
|
||||
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
|
||||
from sqlalchemy.orm import DeclarativeBase
|
||||
|
||||
from models.config import DatabaseConfig
|
||||
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
|
||||
_engine = None
|
||||
_session_factory = None
|
||||
|
||||
|
||||
def get_engine(config: DatabaseConfig):
|
||||
global _engine
|
||||
if _engine is None:
|
||||
url = f"postgresql+asyncpg://{config.username}:{config.password}@{config.host}:{config.port}/{config.database}"
|
||||
_engine = create_async_engine(
|
||||
url,
|
||||
pool_size=config.pool_size,
|
||||
max_overflow=config.max_overflow,
|
||||
pool_timeout=config.pool_timeout,
|
||||
pool_recycle=config.pool_recycle,
|
||||
)
|
||||
return _engine
|
||||
|
||||
|
||||
def get_session_factory(config: DatabaseConfig):
|
||||
global _session_factory
|
||||
if _session_factory is None:
|
||||
engine = get_engine(config)
|
||||
_session_factory = async_sessionmaker(engine, expire_on_commit=False)
|
||||
return _session_factory
|
||||
|
||||
|
||||
async def get_session(config: DatabaseConfig) -> AsyncGenerator[AsyncSession, None]:
|
||||
factory = get_session_factory(config)
|
||||
async with factory() as session:
|
||||
yield session
|
||||
|
||||
|
||||
async def init_db(config: DatabaseConfig) -> None:
|
||||
engine = get_engine(config)
|
||||
async with engine.begin() as conn:
|
||||
from .models import Base
|
||||
await conn.run_sync(Base.metadata.create_all)
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from sqlalchemy import String, Float, Integer, Boolean, DateTime, JSON, ForeignKey
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
|
||||
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
|
||||
class FlightModel(Base):
|
||||
__tablename__ = "flights"
|
||||
|
||||
id: Mapped[str] = mapped_column(String(36), primary_key=True)
|
||||
name: Mapped[str] = mapped_column(String(255))
|
||||
description: Mapped[str] = mapped_column(String(1000))
|
||||
start_lat: Mapped[float] = mapped_column(Float)
|
||||
start_lon: Mapped[float] = mapped_column(Float)
|
||||
altitude: Mapped[float] = mapped_column(Float)
|
||||
camera_params: Mapped[dict] = mapped_column(JSON)
|
||||
geofences: Mapped[dict] = mapped_column(JSON)
|
||||
status: Mapped[str] = mapped_column(String(50), default="created")
|
||||
frames_processed: Mapped[int] = mapped_column(Integer, default=0)
|
||||
frames_total: Mapped[int] = mapped_column(Integer, default=0)
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
|
||||
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
waypoints: Mapped[list["WaypointModel"]] = relationship(back_populates="flight", cascade="all, delete-orphan")
|
||||
frame_results: Mapped[list["FrameResultModel"]] = relationship(back_populates="flight", cascade="all, delete-orphan")
|
||||
chunks: Mapped[list["ChunkModel"]] = relationship(back_populates="flight", cascade="all, delete-orphan")
|
||||
|
||||
|
||||
class WaypointModel(Base):
|
||||
__tablename__ = "waypoints"
|
||||
|
||||
id: Mapped[str] = mapped_column(String(36), primary_key=True)
|
||||
flight_id: Mapped[str] = mapped_column(String(36), ForeignKey("flights.id"))
|
||||
lat: Mapped[float] = mapped_column(Float)
|
||||
lon: Mapped[float] = mapped_column(Float)
|
||||
altitude: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
|
||||
confidence: Mapped[float] = mapped_column(Float, default=0.0)
|
||||
refined: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
timestamp: Mapped[datetime] = mapped_column(DateTime)
|
||||
|
||||
flight: Mapped["FlightModel"] = relationship(back_populates="waypoints")
|
||||
|
||||
|
||||
class FrameResultModel(Base):
|
||||
__tablename__ = "frame_results"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
flight_id: Mapped[str] = mapped_column(String(36), ForeignKey("flights.id"))
|
||||
frame_id: Mapped[int] = mapped_column(Integer)
|
||||
gps_lat: Mapped[float] = mapped_column(Float)
|
||||
gps_lon: Mapped[float] = mapped_column(Float)
|
||||
altitude: Mapped[float] = mapped_column(Float)
|
||||
heading: Mapped[float] = mapped_column(Float)
|
||||
confidence: Mapped[float] = mapped_column(Float)
|
||||
refined: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
objects: Mapped[dict] = mapped_column(JSON, default=list)
|
||||
timestamp: Mapped[datetime] = mapped_column(DateTime)
|
||||
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
flight: Mapped["FlightModel"] = relationship(back_populates="frame_results")
|
||||
|
||||
|
||||
class ChunkModel(Base):
|
||||
__tablename__ = "chunks"
|
||||
|
||||
id: Mapped[str] = mapped_column(String(36), primary_key=True)
|
||||
flight_id: Mapped[str] = mapped_column(String(36), ForeignKey("flights.id"))
|
||||
start_frame_id: Mapped[int] = mapped_column(Integer)
|
||||
end_frame_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
|
||||
frames: Mapped[list] = mapped_column(JSON, default=list)
|
||||
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
|
||||
has_anchor: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
anchor_frame_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
|
||||
anchor_lat: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
|
||||
anchor_lon: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
|
||||
matching_status: Mapped[str] = mapped_column(String(50), default="unanchored")
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
|
||||
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
flight: Mapped["FlightModel"] = relationship(back_populates="chunks")
|
||||
|
||||
Reference in New Issue
Block a user