Database - Snailz Docs

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:])