Interroger les tables en SQL
Exécutez des requêtes SELECT et des JOINs sur les tables gérées de votre espace de travail directement depuis un notebook — masquage des colonnes toujours appliqué, sans configuration supplémentaire.
Le module scrydon.sql donne aux notebooks une surface SQL native sur les tables gérées de l'espace de travail. Connectez-vous une fois et le panneau Sources de données liste vos tables avec leurs colonnes — écrivez ensuite des requêtes SELECT, JOIN et GROUP BY exactement comme vous le feriez avec n'importe quelle connexion de base de données.
Chaque ligne que le notebook reçoit est déjà masquée : les mêmes politiques de masquage des colonnes que celles appliquées dans Analytics s'appliquent ici. Aucune configuration supplémentaire n'est nécessaire et aucun chemin ne les contourne.
Se connecter et explorer
Ajoutez cette cellule de configuration en haut du notebook :
from scrydon import sql
con = sql.connect() # les tables de l'espace de travail apparaissent dans Sources de donnéessql.connect() découvre vos tables et les enregistre dans la connexion DuckDB qu'elle retourne. Marimo liste la connexion dans le panneau Sources de données sur la gauche, sous une base de données scrydon, où vous pouvez cliquer sur une table pour voir ses colonnes ou lancer une cellule SELECT * FROM <table>.
Par défaut, connect() charge les tables les plus petites pour qu'une cellule SQL native retourne des lignes immédiatement. Les tables plus volumineuses (au-delà d'environ 50 000 lignes) apparaissent dans le panneau mais restent vides jusqu'à ce que vous les chargiez avec sql.hydrate("nom_table") ou les interrogiez via sql.query(...). Le chargement s'exécute en parallèle, donc le panneau est prêt en quelques secondes même avec de nombreuses tables.
Vous voulez le panneau instantanément, sans aucune lecture de données ? Passez sql.connect(load=False) pour une connexion en découverte seule — chaque table affiche alors ses colonnes mais retourne zéro ligne jusqu'à ce que vous appeliez sql.hydrate("nom_table") ou sql.query(...).
Exécuter une requête
Cliquez sur une table dans le panneau pour insérer une cellule SELECT *, ou écrivez votre propre cellule SQL :
SELECT supplier_name, risk_score
FROM suppliers
WHERE country = 'DE'
ORDER BY risk_score DESC
LIMIT 100Vous pouvez exécuter la même requête depuis une cellule Python et obtenir un DataFrame. sql.query(...) charge exactement les tables référencées par votre requête (via la lecture masquée gouvernée), donc elle fonctionne aussi sur les grandes tables que connect() n'a pas préchargées :
df = sql.query("""
SELECT supplier_name, risk_score
FROM suppliers
WHERE country = 'DE'
ORDER BY risk_score DESC
LIMIT 100
""")JOINs et agrégations
Le SQL sur plusieurs tables fonctionne de la même façon :
SELECT s.supplier_name,
COUNT(o.id) AS order_count,
SUM(o.total) AS revenue
FROM suppliers s
JOIN orders o ON s.id = o.supplier_id
WHERE o.placed_at >= '2025-01-01'
GROUP BY s.supplier_name
ORDER BY revenue DESCSeules les tables référencées par votre requête sont chargées — les autres restent comme entrées dans le panneau jusqu'à ce que vous les interrogiez.
Colonnes masquées
Si votre rôle applique un masque sur une colonne, vous voyez la valeur de remplacement dans les résultats — le même comportement que tables.read() et l'aperçu de table Analytics. Un avis ponctuel liste les colonnes masquées lors du premier chargement d'une table.
Pour voir quelles colonnes sont masquées pour vous, appelez tables.get("nom_table") — il retourne la stratégie de masque par colonne ainsi que d'autres métadonnées de schéma.
Tables volumineuses
sql.connect() charge automatiquement les tables les plus petites ; les tables de plus de ~50 000 lignes apparaissent dans le panneau mais ne sont pas chargées, donc une cellule SQL native sur l'une d'elles retourne zéro ligne jusqu'à ce que vous la chargiez. Interrogez-la via sql.query(...) (qui ne charge que ce qu'elle référence) ou préchargez-la avec sql.hydrate("nom").
Pour les très grandes tables, sql.query() vous demande de confirmer avant de charger toutes les lignes :
# Confirmer le chargement d'une très grande table
df = sql.query("SELECT * FROM big_table", allow_large=True)Vous pouvez également pré-charger une grande table dans la connexion pour qu'elle soit disponible dans les cellules SQL natives :
sql.hydrate("big_table", allow_large=True)Actualiser le cache
Chaque table est chargée une fois par session. Si vous écrivez dans une table plus tôt dans le notebook puis l'interrogez, réexécutez la cellule de configuration ou appelez sql.refresh() pour obtenir les nouvelles lignes :
sql.refresh() # réinitialiser la session entière — toutes les tables se rechargent à la prochaine requête
sql.refresh("suppliers") # actualiser une seule tableLecture seule
scrydon.sql est en lecture seule. INSERT, UPDATE, DELETE et CREATE TABLE AS génèrent une erreur qui vous indique la bonne alternative.
scrydon.sql rejette le SQL qui modifierait ou définirait des tables (INSERT, UPDATE, DELETE, CREATE TABLE AS, DROP). Il ne restreint pas les fonctions de lecture natives de DuckDB telles que read_csv() ou les lectures depuis des URL — celles-ci s'exécutent avec les capacités normales de votre notebook et restent soumises à la politique d'egress de l'espace de travail.
# Écrire des lignes dans une table gérée
tables.write("suppliers", df, mode="upsert")
# Publier une nouvelle table gérée depuis un DataFrame
tables.create("supplier_risk_scores", scores_df, classification="internal")Référence rapide
| Appel | Ce qu'il fait |
|---|---|
sql.connect() | Retourne une connexion DuckDB ; enregistre les tables dans Sources de données et charge les plus petites (passez load=False pour ne rien charger) |
sql.query(sql) | Exécute un SELECT et retourne un DataFrame ; charge uniquement les tables référencées à la demande (fonctionne aussi sur les grandes tables) |
sql.hydrate("nom") | Charge les lignes d'une table (pour les cellules SQL natives sur de grandes tables) ; passer allow_large=True pour les très grandes tables |
sql.refresh() | Réinitialise la session — toutes les données en cache sont supprimées |
sql.refresh("nom") | Supprime le cache d'une seule table |
Voir aussi
- Notebooks Marimo — vue d'ensemble complète du SDK incluant lectures, écritures et capacités de la plateforme.
- Tables gérées — comment les tables sont créées et gérées.
- Classification et masquage — les politiques de masquage appliquées aux résultats de vos requêtes.