diff --git a/src/earthkit/data/readers/sql.py b/src/earthkit/data/readers/sql.py new file mode 100644 index 000000000..5f0d9fd3e --- /dev/null +++ b/src/earthkit/data/readers/sql.py @@ -0,0 +1,31 @@ +from . import Reader + + +class SQLReader(Reader): + + def __init__(self, source, sql_engine, sql, **kwargs): + super().__init__(source, sql_engine) + self._sql_engine = sql_engine + self._sql = sql + + def mutate_source(self): + return self + + def to_pandas(self, **kwargs): + import pandas as pd + + conn = self._sql_engine.connect() + try: + df = pd.read_sql(self._sql, conn, **kwargs) + finally: + conn.close() + + return df + + def to_xarray(self, **kwargs): + + return self.to_pandas().to_xarray(**kwargs) + + +def reader(source, path, *, magic=None, deeper_check=False, fwf=False, **kwargs): + return diff --git a/src/earthkit/data/sources/sql.py b/src/earthkit/data/sources/sql.py new file mode 100644 index 000000000..4036dc406 --- /dev/null +++ b/src/earthkit/data/sources/sql.py @@ -0,0 +1,29 @@ +from ..readers.sql import SQLReader +from . import Source + + +def create_sqlalchemy_engine(backend, kwargs): + from sqlalchemy import create_engine + + if backend == "sqlite": + return create_engine(f"sqlite:///{kwargs['path']}") + else: + raise NotImplementedError(f"Backend: {backend} is not implemented.") + + +class SQLSource(Source): + + def __init__(self, backend, backend_kwargs, sql, **kwargs): + super().__init__(**kwargs) + sql_engine = create_sqlalchemy_engine(backend, backend_kwargs) + self._reader = SQLReader(self, sql_engine, sql, **kwargs) + + def mutate(self): + source = self._reader.mutate_source() + if source not in (None, self): + source._parent = self + return source + return self + + +source = SQLSource