#1 Wed 29 October 2025 18:12
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 1032
QGIS: Enchainer requetes SQL sur GPKG
Bonsoir à tous,
J'ai une base de données au format GPKG, sur laquelle j'ai une chaine de requêtes SQL pour mettre à jour les données attributaires (des UPDATE principalement).
Dans le gestionnaire de bases de données de QGis, je suis obligé de sélectionner chaque requête une à une pour les exécuter. Si j'en sélectionne plusieurs à la suite, j'ai l'erreur :
You can only execute one statement at a time.
Je pense que pour enchainer les requêtes SQL en une seule fois, le mieux serait de passer par un script Python (?).
Je me débrouille un peu en Python (en dehors de QGis), mais le souci, c'est que je n'arrive pas à activer l'extension "mod_spatialite" pour que les fonctions spatiales du module sqlite3, et mes requêtes, bien qu'attributaires uniquement, concernent des couches spatiales.
J'ai par exemple ce message pour un simple UPDATE :
Erreur pour : UPDATE matable SET monchamp = mavaleur... -> no such function: ST_IsEmpty
Comment feriez-vous pour automatiser une chaine de requêtes SQL sur un GPKG, vous ?
Je n'ai jamais utilisé la console Python de QGis (je ne sais pas faire) : peut-être serait-ce plus simple que mon installation Python Windows ?
Merci pour vos conseils !
Dernière modification par Sylvain M. (Wed 29 October 2025 18:13)
Sylvain M.
Hors ligne
#2 Mon 03 November 2025 18:10
- Alban Kraus
- Participant actif
- Lieu: Tulle (19)
- Date d'inscription: 13 Jan 2022
- Messages: 84
Re: QGIS: Enchainer requetes SQL sur GPKG
Bonjour Sylvain,
Personnellement, j'aurais utilisé la ligne de commande et ogr2ogr, qui permet d'exécuter un script SQL sur n'importe quel format de données :
https://gdal.org/en/stable/programs/ogr … gr2ogr-sql
On doit pouvoir l'exécuter en Python aussi.
Hors ligne
#4 Tue 25 November 2025 17:00
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 1032
Re: QGIS: Enchainer requetes SQL sur GPKG
Salut à vous,
Je prends enfin le temps de vous donner des nouvelles sur cette question, et la résolution de mon problème.
Personnellement, j'aurais utilisé la ligne de commande et ogr2ogr, qui permet d'exécuter un script SQL sur n'importe quel format de données
Malheureusement, sauf erreur de ma part, seuls les SELECT peuvent être exécutés depuis OGR2OGR, pas les UPDATE ou ALTER TABLE.
"Exécution SQL Spatialite" de la boîte à outils de Traitements pourrait répondre à votre besoin.
Je n'ai pas réussi à y enchainer mes requêtes SQL en un seul traitement.
Mais finalement, je n'ai pas baissé les bras sur le problème d'activation de l'extension "mod_spatialite" pour activer les fonctions spatiales du module sqlite3 de Python.
Et figurez-vous que j'avais déjà eu ce problème sur mon ancien PC, et que je ne m'en souvenais plus !
Et j'ai retrouvé l'échange où Nicolas Ribot m'avait donné la solution (merci encore à lui !), qui a fonctionné parfaitement aujourd'hui sur mon nouveau PC !
Et du coup, voici donc un exemple de script Python pour exécuter les requêtes d'un fichier SQL sur un GeoPackage :
Code:
import sqlite3
# Chemins GeoPackage et script SQL
gpkg_path = r"D:\Chemin\bdd.gpkg"
sql_script_path = r"D:\Chemin\script.sql"
# Connexion à la base
conn = sqlite3.connect(gpkg_path)
conn.enable_load_extension(True) # Autorise le chargement d'extensions
# Activation Extension Spatialite
conn.enable_load_extension(True)
conn.execute('SELECT load_extension("mod_spatialite")')
conn.execute('SELECT InitSpatialMetaData();')
cursor = conn.cursor()
print("Extension Spatialite Chargée")
# Lecture du fichier SQL
with open(sql_script_path, 'r', encoding='utf-8') as sql_file:
sql_script = sql_file.read()
# Exécution des requêtes
for requete in sql_script.split(';'):
requete = requete.strip()
if requete:
try:
cursor.execute(requete)
print(f"Exécuté : {requete[:50]}...")
except Exception as e:
print(f"Erreur pour : {requete[:50]}... -> {e}")
# Validation des modifications
conn.commit()
conn.close()
print("Traitement terminé.")Si jamais ça peut être utile à d'autres ! ![]()
Dernière modification par Sylvain M. (Tue 25 November 2025 17:01)
Sylvain M.
Hors ligne
#5 Tue 25 November 2025 18:45
Re: QGIS: Enchainer requetes SQL sur GPKG
Bonjour,
Malheureusement, sauf erreur de ma part, seuls les SELECT peuvent être exécutés depuis OGR2OGR, pas les UPDATE ou ALTER TABLE.
Pour GDAL, pour faire des UPDATE ou ALTER TABLE en ligne de commande, passez par ogrinfo plutôt que ogr2ogr (cf en anglais https://gis.stackexchange.com/a/347058/638). Attention, vous devrez potentiellement échapper les doubles ou les simples guillemets dans vos requêtes.
Thomas
Hors ligne


