switch from using dataset to raw sqlite3 module
dataset is kinda unmaintaned and currently broken due to sqlalchemy 2.0 changes resolves https://github.com/karlicoss/HPI/issues/264
This commit is contained in:
parent
9c432027b5
commit
5c82d0faa9
8 changed files with 123 additions and 103 deletions
|
@ -1,17 +1,19 @@
|
|||
from .common import assert_subpackage; assert_subpackage(__name__)
|
||||
|
||||
|
||||
from contextlib import contextmanager
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import sqlite3
|
||||
from tempfile import TemporaryDirectory
|
||||
from typing import Tuple, Any, Iterator, Callable, Optional, Union
|
||||
|
||||
|
||||
from .common import PathIsh
|
||||
from .common import PathIsh, assert_never
|
||||
from .compat import Literal
|
||||
|
||||
|
||||
def sqlite_connect_immutable(db: PathIsh) -> sqlite3.Connection:
|
||||
# https://www.sqlite.org/draft/uri.html#uriimmutable
|
||||
return sqlite3.connect(f'file:{db}?immutable=1', uri=True)
|
||||
|
||||
|
||||
|
@ -30,6 +32,42 @@ def test_sqlite_connect_immutable(tmp_path: Path) -> None:
|
|||
conn.execute('DROP TABLE testtable')
|
||||
|
||||
|
||||
SqliteRowFactory = Callable[[sqlite3.Cursor, sqlite3.Row], Any]
|
||||
|
||||
def dict_factory(cursor, row):
|
||||
fields = [column[0] for column in cursor.description]
|
||||
return {key: value for key, value in zip(fields, row)}
|
||||
|
||||
|
||||
Factory = Union[SqliteRowFactory, Literal['row', 'dict']]
|
||||
|
||||
@contextmanager
|
||||
def sqlite_connection(db: PathIsh, *, immutable: bool=False, row_factory: Optional[Factory]=None) -> Iterator[sqlite3.Connection]:
|
||||
dbp = f'file:{db}'
|
||||
# https://www.sqlite.org/draft/uri.html#uriimmutable
|
||||
if immutable:
|
||||
dbp = f'{dbp}?immutable=1'
|
||||
row_factory_: Any = None
|
||||
if row_factory is not None:
|
||||
if callable(row_factory):
|
||||
row_factory_ = row_factory
|
||||
elif row_factory == 'row':
|
||||
row_factory_ = sqlite3.Row
|
||||
elif row_factory == 'dict':
|
||||
row_factory_ = dict_factory
|
||||
else:
|
||||
assert_never()
|
||||
|
||||
conn = sqlite3.connect(dbp, uri=True)
|
||||
try:
|
||||
conn.row_factory = row_factory_
|
||||
with conn:
|
||||
yield conn
|
||||
finally:
|
||||
# Connection context manager isn't actually closing the connection, only keeps transaction
|
||||
conn.close()
|
||||
|
||||
|
||||
# TODO come up with a better name?
|
||||
# NOTE: this is tested by tests/sqlite.py::test_sqlite_read_with_wal
|
||||
def sqlite_copy_and_open(db: PathIsh) -> sqlite3.Connection:
|
||||
|
@ -52,8 +90,6 @@ def sqlite_copy_and_open(db: PathIsh) -> sqlite3.Connection:
|
|||
return dest
|
||||
|
||||
|
||||
from typing import Tuple, Any, Iterator
|
||||
|
||||
# NOTE hmm, so this kinda works
|
||||
# V = TypeVar('V', bound=Tuple[Any, ...])
|
||||
# def select(cols: V, rest: str, *, db: sqlite3.Connetion) -> Iterator[V]:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue