Insérer automatiquement des données SQL dans un fichier reStructuredText

Nous allons créer une base de données de produits avec leurs versions, puis mettre en forme ces informations dans un fichier reStructuredText. Elles pourront donc facilement être mises en forme et publiées au format PDF, HTML ou autre.

  1. Créez la base de données SQLite3 productdb.db:

    #!/usr/bin/python
    # coding: utf8
    import sqlite3
    
    try:
        db = sqlite3.connect('productdb.db')
    
        cursor = db.cursor()
    
        cursor.execute('''CREATE TABLE products (
            product text,
            version text)''')
    
        db.commit()
    
        cursor.close()
        db.close()
    
    except:
        print('Erreur lors de la création de la base.')
        exit(1)
    
    print('La base de données a été créée.')
    
  2. Insérez des données dans la base :

    #!/usr/bin/python
    # coding: utf8
    import sqlite3
    
    prods = [('dianthus', '1.0'), ('geum', '1.5'), ('prunus', '2.3'),
             ('dianthus', '1.1'), ('geum', '1.7'), ('prunus', '2.5'),
             ('dianthus', '1.2'), ('geum', '3.5'), ('prunus', '2.7'), ]
    
    try:
        db = sqlite3.connect('productdb.db')
    
        cursor = db.cursor()
    
        for data in prods:
            cursor.execute('INSERT INTO products (product, version) VALUES (?, ?)',
                           data)
    
        db.commit()
    
        cursor.close()
        db.close()
    
    except:
        print('Erreur lors de l\'insertion de données dans la base.')
        exit(1)
    
    print('Les données ont été insérées.')
    
  3. Créez le fichier modele-sql.rst suivant :

    {% for prod in product %}
    {{ prod | capitalize }}
    {% for c in prod %}-{% endfor %}
       {% for ver in version %}
    - {{ ver }}
       {% endfor %}
    {% endfor %}
    
  4. Exécutez le script Python suivant :

    #!/usr/bin/python
    # coding: utf8
    import sqlite3
    import jinja2
    
    env = jinja2.Environment(loader=jinja2.FileSystemLoader('./'))
    template = env.get_template('modele-sql.rst')
    
    print('Produits et versions\n====================')
    
    try:
        db = sqlite3.connect('productdb.db')
    
        cursor = db.cursor()
    
        for myprod in ("dianthus", "geum", "prunus"):
            t = (myprod,)
            cursor.execute('SELECT version FROM products WHERE product = ?', t)
            mylist = []
            for row in cursor:
                mylist.append('{}'.format(*row))
    
            data = {
                'product': [myprod],
                'version': mylist
            }
    
            print(template.render(data))
    
        cursor.close()
        db.close()
    
    except:
        print('Erreur lors de la lecture de la base.')
        exit(1)
    

    Le contenu suivant s’affiche :

    Produits et versions
    ====================
    
    Dianthus
    --------
    
    - 1.0
    
    - 1.1
    
    - 1.2
    
    Geum
    ----
    
    - 1.5
    
    - 1.7
    
    - 3.5
    
    Prunus
    ------
    
    - 2.3
    
    - 2.5
    
    - 2.7