IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Une requète qui écrase des données supérieures aux 3 derniers mois


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut Une requète qui écrase des données supérieures aux 3 derniers mois
    Bonjour,

    J'essaie de créer une requête de type DELETE supprimant toutes les données de ma tables dont la date de mise en BDD est antérieure aux 3 derniers mois écoulés.
    C'est sur le "" dernies mois écoulés" que je bute précisement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE  from matable tous_mes_champs WHERE date_courante-3derniers_mois
    Désolé pour l'écriture foireuse. Je précise que je suis sous sqLite python


    Merci à vous

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 433
    Points : 1 129
    Points
    1 129
    Par défaut
    Bonjour,

    La syntaxe du DELETE https://www.sqlite.org/lang_delete.html


    La syntaxe des fonctions date et heure https://www.sqlite.org/lang_datefunc.html

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM <ta_table> where <ta_date_d_insertion> < DATE('NOW', '-3 months')
    Cordialement

  3. #3
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Génial le lien, que dire...merci !

  4. #4
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    Je reviens à la charge car je n'arrive pas à faire tourner ma requête en fait.
    J'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute('DELETE FROM vivarium_test_table WHERE DATE('NOW', '-3 months')')
    Sans succès. Le problème doit venir du fait que je crée un objet datetime() de la date instantanée qui est stocké sous forme de string dans ma bdd. Je vais chercher

  5. #5
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 433
    Points : 1 129
    Points
    1 129
    Par défaut
    Bonjour,



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM vivarium_test_table WHERE DATE('NOW', '-3 months')
    Il faut que tu compares la date d'insertion de ta ligne (à toi de donner le nom de la colonne) j'avais mis <ta_date_d_insertion> à la date calculée.
    Bien entendu, cela fonctionne à condition que la date d'insertion soit stockée au format ISO (AAAA-MM-JJ soit 2019-11-09 pour aujourd'hui) sous forme de chaîne de caractères.

    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM vivarium_test_table WHERE <ta_date_d_insertion>  <  DATE('NOW', '-3 months')
    à comparer à ce que tu as donné

    De plus, je ne connais pas assez python pour être affirmatif mais je crois qu'il va falloir doubler les quotes pour que cela arrive correctement à SQLITE.

    Cordialement

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Bonjour,
    A moins que ce soit un problème de copier/coller, je vois surtout un problème dans le code: le délimiteur de chaine étant le même dans le code et dans la requête, il faut échapper ceux de la requête.
    Sinon ce que SqlLite reçoit n'est pas tout à fait ce que l'on croit.

    Tatayo.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je suis d'accord avec Acaunes, mais ce qui m'a choqué est cursor.executec'est un delete donc cela ne renvoie pas de lignes, donc ça n'a pas de rapport avec un curseur. Je ne connais pas sqllite,ni python mais pour moi les curseurs, concernent les select.
    Bon weekend
    Soazig

  8. #8
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    Merci pour votre aide. ça avance doucement :
    J'ai converti en isoformat comme le préconise justement Acaumes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    date = datetime.datetime.now().replace(microsecond=0).isoformat()
    permet de récupérer l'isoformat avec le temps
    Ensuite j'ai remanié la requête comme suit (ça ne fonctionne pas encore mais je ne suis pas loin je pense)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cursor.execute('DELETE FROM vivarium_test_table WHERE date = DATE("NOW", "-3 months")')
    J'ai mis des double quote, et j'ai spécifié que ma date devait être égale à une date postérieure à 3 mois (c'est comme ça que j'ai compris le DATE("NOW", "-3 months")'))
    Pour tester je vais essayer avec une date de péremption des données plus courte

    Pour Soazig, effectivement on peut se poser la question du "cursor.execute", cependant j'ai vu un tuto où l'auteur l'utilise sur des inserts comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     try:
            connex = sqlite3.connect("bdd_vivarium_test.db")
            cursor = connex.cursor()
            dataList = return_data()
            cursor.execute('INSERT INTO vivarium_test_table(temp, id_capt, date) VALUES(?,?,?)', dataList)
            connex.commit()
        except Exception as e:
            print("[ERREUR]", e)  # Comment bien gérer exception ??
            connex.rollback()
        finally:
            connex.close()
    Du coup je l'ai appliqué scolairement sur le delete

  9. #9
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 433
    Points : 1 129
    Points
    1 129
    Par défaut
    Bonjour,

    Là je ne comprends pas vraiment ce que tu cherches à faire

    Tu calcules une date dans ton programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date = datetime.datetime.now().replace(microsecond=0).isoformat()
    cela te donne la date du jour en format ISO mais cette variable reste dans ton programme et n'est pas propagée dans ta requête.

    puis tu passes ta requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM vivarium_test_table WHERE date = DATE("NOW", "-3 months")
    Mais dans ta requête la date c'est une colonne dans ta base de données (pas celle que tu as calculé auparavant). De plus DATE est un mot réservé de SQL ce qui fait que cela risque de poser des problèmes (pour SQLITE utiliser [DATE] si la colonne a été nommée date). Mais à voir tes remarques as tu une colonne qui donne la date d'insertion dans ta base? Si oui, c'est le nom de cette colonne que tu dois indiquer, si non, ton problème est impossible il te faut ajouter une colonne date d'insertion dans ta base pour pouvoir effacer les lignes insérées avant une certaine date.

    NB Au vu de tout ceci, le calcul de la variable date dans python est elle encore nécessaire?

    Cordialement

  10. #10
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Salut,

    Je suis stupide, j'ai nommé l'insertion de ma date (le format iso) comme la colonne...Du coup j'ai renommé ma colonne qui contient les dates (au format iso donc) "current_date"

    J'ai retesté avec cette écriture pensant que la fonction DATE_ADD() serait plus appropriée (j'ai mis 2 h pour voir les effets sur la bdd de test)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cursor.execute('DELETE FROM vivarium_test_table WHERE current_date < DATE_ADD("now", INTERVAL -2 HOUR)')
    Mais j'ai une erreur de syntaxe...
    Je vais retester avec la tienne

    J'ai oublié de te répondre : le calcul de la variable date m'est demandé car elle doit être retournée dans un mail d'alerte dans mon programme si j'ai bien saisis ta question

    Merci encore

  11. #11
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 433
    Points : 1 129
    Points
    1 129
    Par défaut
    Citation Envoyé par olivier252 Voir le message
    Salut,
    Mais j'ai une erreur de syntaxe...
    Je vais retester avec la tienne

    J'ai oublié de te répondre : le calcul de la variable date m'est demandé car elle doit être retournée dans un mail d'alerte dans mon programme si j'ai bien saisis ta question
    DATE_ADD fait partie de la norme SQL mais n'est pas compris par SQLITE d'où l'erreur de syntaxe.

    Si la variable date t'est demandée pas de problème mais tu peux la formater comme tu veux cela n'aura aucune effet sur ta requête.

  12. #12
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Ok merci pour ton aide une fois encore

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par acaumes Voir le message
    DATE_ADD fait partie de la norme SQL mais n'est pas compris par SQLITE d'où l'erreur de syntaxe.

    Si la variable date t'est demandée pas de problème mais tu peux la formater comme tu veux cela n'aura aucune effet sur ta requête.
    Non, pas du tout. DATE_ADD n'existe pas dans la norme SQL pour laquelle les opérations sur les dates passent par le type "INTERVAL"....

    Donc, la norme c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MaDate + CAST('1 month' AS INTERVAL)
    Month pouvant être remplacé par HOUR, YEAR...

    MAIS !!!! La norme SQL interdit tout ajout de mois à une date et tout ajout dans laquelle une granularité intermédiaire de mois y figure car le nombre de jours d'un mois différe de mois en mois…..

    Pour votre information, relisez mes livres sur le langage SQL :
    Nom : SQL.jpg
Affichages : 160
Taille : 47,4 Ko

    A +

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/11/2012, 16h18
  2. Réponses: 1
    Dernier message: 26/07/2012, 10h25
  3. Réponses: 1
    Dernier message: 18/03/2012, 09h59
  4. Réponses: 3
    Dernier message: 22/10/2010, 07h15
  5. Réponses: 4
    Dernier message: 09/01/2008, 20h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo