Skip to content

Commit 17bd321

Browse files
committed
wip: sql source and reader
1 parent fc7f702 commit 17bd321

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

src/earthkit/data/readers/sql.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from . import Reader
2+
3+
4+
class SQLReader(Reader):
5+
6+
def __init__(self, source, sql_engine, sql, **kwargs):
7+
super().__init__(source, sql_engine)
8+
self._sql_engine = sql_engine
9+
self._sql = sql
10+
11+
def mutate_source(self):
12+
return self
13+
14+
def to_pandas(self, **kwargs):
15+
import pandas as pd
16+
17+
conn = self._sql_engine.connect()
18+
try:
19+
df = pd.read_sql(self._sql, conn, **kwargs)
20+
finally:
21+
conn.close()
22+
23+
return df
24+
25+
def to_xarray(self, **kwargs):
26+
27+
return self.to_pandas().to_xarray(**kwargs)
28+
29+
30+
def reader(source, path, *, magic=None, deeper_check=False, fwf=False, **kwargs):
31+
return

src/earthkit/data/sources/sql.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from ..readers.sql import SQLReader
2+
from . import Source
3+
4+
5+
def create_sqlalchemy_engine(backend, kwargs):
6+
from sqlalchemy import create_engine
7+
8+
if backend == "sqlite":
9+
return create_engine(f"sqlite:///{kwargs['path']}")
10+
else:
11+
raise NotImplementedError(f"Backend: {backend} is not implemented.")
12+
13+
14+
class SQLSource(Source):
15+
16+
def __init__(self, backend, backend_kwargs, sql, **kwargs):
17+
super().__init__(**kwargs)
18+
sql_engine = create_sqlalchemy_engine(backend, backend_kwargs)
19+
self._reader = SQLReader(self, sql_engine, sql, **kwargs)
20+
21+
def mutate(self):
22+
source = self._reader.mutate_source()
23+
if source not in (None, self):
24+
source._parent = self
25+
return source
26+
return self
27+
28+
29+
source = SQLSource

0 commit comments

Comments
 (0)