Skip to content

Database

Save data in SQLite database.

database_generate(root, db_file)

Create a SQLite database from CSV files.

Parameters:

Name Type Description Default
root Path

Path to directory containing CSV files.

required
db_file str | None

Filename for database file or None.

required

Returns:

Type Description
Connection | None

sqlite3.Connection: Database connection if database is in-memory or None otherwise

Source code in src/snailz/database.py
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
def database_generate(root: Path, db_file: str | None) -> sqlite3.Connection | None:
    """Create a SQLite database from CSV files.

    Parameters:
        root: Path to directory containing CSV files.
        db_file: Filename for database file or None.

    Returns:
        sqlite3.Connection: Database connection if database is in-memory or None otherwise
    """
    if db_file is None:
        conn = sqlite3.connect(":memory:")
    else:
        db_path = root / db_file
        Path(db_path).unlink(missing_ok=True)
        conn = sqlite3.connect(db_path)

    cursor = conn.cursor()

    _import_single_files(root, cursor)
    _import_assay_files(
        root,
        cursor,
        "*_treatments.csv",
        TREATMENTS_CREATE,
        TREATMENTS_INSERT,
        lambda v: v,
    )
    _import_assay_files(
        root,
        cursor,
        "*_readings.csv",
        READINGS_CREATE,
        READINGS_INSERT,
        lambda v: float(v),
    )

    conn.commit()

    if db_file is None:
        return conn
    else:
        conn.close()
        return None

_import_assay_files(root, cursor, pattern, create, insert, convert)

Import data from all clean assay files.

Source code in src/snailz/database.py
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
def _import_assay_files(
    root: Path,
    cursor: sqlite3.Cursor,
    pattern: str,
    create: str,
    insert: str,
    convert: Callable,
) -> None:
    """Import data from all clean assay files."""
    cursor.execute(create)
    for filename in (root / utils.ASSAYS_DIR).glob(pattern):
        with open(filename, "r") as stream:
            rows = [r for r in csv.reader(stream)]
            assert rows[0][0] == "id"
            ident = rows[0][1]
            data = [r[1:] for r in rows[5:]]
            temp = []
            for i, row in enumerate(data):
                for j, val in enumerate(row):
                    temp.append((ident, i + 1, chr(ord("A") + j), convert(val)))
            cursor.executemany(insert, temp)

_import_single_files(root, cursor)

Import single CSV files into database.

Source code in src/snailz/database.py
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
def _import_single_files(root: Path, cursor: sqlite3.Cursor) -> None:
    """Import single CSV files into database."""
    for filepath, header, create, insert in (
        (root / utils.ASSAYS_CSV, ASSAYS_HEADER, ASSAYS_CREATE, ASSAYS_INSERT),
        (root / utils.PERSONS_CSV, PERSONS_HEADER, PERSONS_CREATE, PERSONS_INSERT),
        (
            root / utils.SPECIMENS_CSV,
            SPECIMENS_HEADER,
            SPECIMENS_CREATE,
            SPECIMENS_INSERT,
        ),
    ):
        with open(filepath, "r") as stream:
            data = [row for row in csv.reader(stream)]
            assert data[0] == header
            cursor.execute(create)
            cursor.executemany(insert, data[1:])