Aller au contenu

⛰ Ascension de l'Himalaya⚓︎

On dispose d'une base de données des ascensions de l'Himalaya depuis 1903 compilés par Elizabeth Hawley, une journaliste spécialisée basée à Kathmandou.

Les différentes tables sont représentées par le schéma suivant :

Le schéma

La base est organisée de la façon suivante :

  • La table peaks contient un enregistrement par montagne de l'Himalaya.
  • La table exped possède un enregistrement par expédition.
  • La table members décrit chaque membre significatif des expéditions.
  • La table refer décrit la littérature sur les expéditions.

Cette base est téléchargeble au format sqlite ici

???+

📋 Texte
```shell
wget https://www.himalayandatabase.com/downloads/Himalayan%20Database.zip -O download/Himalayan_Database.zip
unzip download/Himalayan_Database.zip -d download/
```

```python
#!/usr/bin/env python

import sqlite3
from dbfread import DBF


def get_fields(table):
    """get the fields and sqlite types for a dbf table"""
    typemap = {
        "F": "FLOAT",
        "L": "BOOLEAN",
        "I": "INTEGER",
        "C": "TEXT",
        "N": "REAL",  # because it can be integer or float
        "M": "TEXT",
        "D": "DATE",
        "T": "DATETIME",
        "0": "INTEGER",
    }

    fields = {}
    for f in table.fields:
        fields[f.name] = typemap.get(f.type, "TEXT")
    return fields


def create_table_statement(table_name, fields):
    defs = ", ".join(['"%s" %s' % (fname, ftype) for (fname, ftype) in fields.items()])
    sql = 'create table "%s" (%s)' % (table_name, defs)
    return sql


def insert_table_statement(table_name, fields):
    refs = ", ".join([":" + f for f in fields.keys()])
    sql = 'insert into "%s" values (%s)' % (table_name, refs)
    return sql


def copy_table(cursor, table):
    """Add a dbase table to an open sqlite database"""
    cursor.execute("drop table if exists %s" % table.name)
    fields = get_fields(table)

    sql = create_table_statement(table.name, fields)
    cursor.execute(sql)

    sql = insert_table_statement(table.name, fields)

    for rec in table:
        cursor.execute(sql, list(rec.values()))


def main():
    output_file = "himalayan_database.sqlite"
    tables = ["exped", "members", "peaks", "refer"]
    conn = sqlite3.connect(output_file)
    cursor = conn.cursor()

    for table_name in tables:
        table_file = f"download/Himalayan Database/HIMDATA/{table_name}.DBF"
        dbf_table = DBF(
            table_file, lowernames=True, encoding=None, char_decode_errors="strict"
        )
        copy_table(cursor, dbf_table)

    conn.commit()


if __name__ == "__main__":
    main()
```

Voir [cette page qui décrit la conversion](https://www.peter-hoffmann.com/2021/convert-the-himalayan-database-to-sqlite.html)
  1. Combien de sommets sont présents dans cette base de données ?

    Votre réponse