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

> **Note: Technique spécialisée**
>
> La génération à partir de données SQL conserve les données produit dans une base et génère le texte correspondant au moment de la génération. La chaîne utilisée ici (Python, SQLite, Jinja et reStructuredText) n'est qu'une mise en œuvre de ce principe ; voir [base de données SQL](https://docs.redaction-technique.org/fr/tech-writing-process/sql-database/) pour comprendre pourquoi le texte lui-même a intérêt à rester dans des fichiers.

## Objectif

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('./'), lstrip_blocks=True)
    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 :

    ```txt
    Produits et versions
    ====================

    Dianthus
    --------

    - 1.0

    - 1.1

    - 1.2

    Geum
    ----

    - 1.5

    - 1.7

    - 3.5

    Prunus
    ------

    - 2.3

    - 2.5

    - 2.7
    ```

## Articles connexes

- [Créer des documents différents à partir des mêmes sources via Jinja](https://docs.redaction-technique.org/fr/tutorials/conditional-text-jinja/)
- [Expressions régulières en Python](https://docs.redaction-technique.org/fr/tutorials/python-regular-expressions/)
- [sed : modifiez votre texte sans ouvrir vos fichiers](https://docs.redaction-technique.org/fr/tutorials/sed-text-editing/)

---

Source: https://docs.redaction-technique.org/fr/tutorials/auto-insert-sql-data-restructuredtext/
