add CLI helpers, switch to bottle-sqlalchemy

This commit is contained in:
evilchili
2022-11-25 15:40:24 -08:00
parent 267af75cb4
commit 7ca1f69100
7 changed files with 159 additions and 21 deletions
+1
View File
@@ -1 +1,2 @@
from groove.db.schema import metadata, track, playlist, entry
from groove.db.helpers import windowed_query
+20
View File
@@ -0,0 +1,20 @@
def windowed_query(query, column, window_size):
""""
Break a Query into chunks on a given column.
see: https://github.com/sqlalchemy/sqlalchemy/wiki/RangeQuery-and-WindowedRangeQuery
"""
single_entity = query.is_single_entity
query = query.add_columns(column).order_by(column)
last_id = None
while True:
sub_query = query
if last_id is not None:
sub_query = sub_query.filter(column > last_id)
chunk = sub_query.limit(window_size).all()
if not chunk:
break
last_id = chunk[-1][-1]
for row in chunk:
yield row
+43
View File
@@ -0,0 +1,43 @@
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from . import metadata
class DatabaseManager:
"""
A context manager for working with sqllite database.
"""
def __init__(self):
self._engine = None
self._session = None
@property
def engine(self):
if not self._engine:
self._engine = create_engine(f"sqlite:///{os.environ.get('DATABASE_PATH')}", future=True)
return self._engine
@property
def session(self):
if not self._session:
Session = sessionmaker(bind=self.engine, future=True)
self._session = Session()
return self._session
def import_from_filesystem(self):
pass
def __enter__(self):
metadata.create_all(bind=self.engine)
return self
def __exit__(self, exc_type, exc_value, traceback):
if self.session:
self.session.close()
database_manager = DatabaseManager