diff options
author | BonfaceKilz | 2021-06-07 11:16:25 +0300 |
---|---|---|
committer | zsloan | 2021-06-18 22:08:04 +0000 |
commit | f5d3828b965bdc5ce98dd8f4714c5bf264c23f9c (patch) | |
tree | b59e4c07c5e97ed23cd1c0cfbb9fa3e3ec7886b6 | |
parent | cf8e058682702e7203ec5eb019717cba09887272 (diff) | |
download | genenetwork3-f5d3828b965bdc5ce98dd8f4714c5bf264c23f9c.tar.gz |
gn3: db: Add "fetchall" method.
-rw-r--r-- | gn3/db/__init__.py | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/gn3/db/__init__.py b/gn3/db/__init__.py index d311dea..25ecfd6 100644 --- a/gn3/db/__init__.py +++ b/gn3/db/__init__.py @@ -1,7 +1,7 @@ # pylint: disable=[R0902, R0903] """Module that exposes common db operations""" from dataclasses import asdict, astuple -from typing import Optional, Dict, Any +from typing import Any, Dict, Optional, Generator from typing_extensions import Protocol from gn3.db.metadata_audit import MetadataAudit @@ -77,6 +77,24 @@ def fetchone(conn: Any, return DATACLASSMAP[table](*cursor.fetchone()) +def fetchall(conn: Any, + table: str, + where: Optional[Dataclass]) -> Optional[Generator]: + """Run a SELECT on a table. Returns all the results as a tuple!""" + if not any(astuple(where)): + return None + where_ = {k: v for k, v in asdict(where).items() + if v is not None and k in TABLEMAP[table]} + sql = f"SELECT * FROM {table} " + if where: + sql += "WHERE " + sql += " AND ".join(f"{TABLEMAP[table].get(k)} = " + "%s" for k in where_.keys()) + with conn.cursor() as cursor: + cursor.execute(sql, tuple(where_.values())) + return (DATACLASSMAP[table](*record) for record in cursor.fetchall()) + + def insert(conn: Any, table: str, data: Dataclass) -> Optional[int]: |