Requete sql contenant une variable date

ami2284 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
ami2284 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je veux exécuter cette requête en python qui me donne des résultats selon la date d'hier, si je fais directement la date ça s’exécute , mais avec la variable non:

before_one_days = date_today - no_of_days
print("Before Four Days:", before_one_days)
try:

connection = psycopg2.connect(database="testbd", user="postgres", host="localhost",
password="admin", port="5432")
cursor = connection.cursor()
cursor.execute("SELECT * FROM datafwi where datefwi='+before_one_days +'")

Merci pour votre aide

6 réponses

  1. trifou
     
    Bonjour,

    Que vaut before_one_days ?
    Si le format de la date est bon, es-tu certain que dans ta table il y a au moins une ligne avec la colonne datefwi à cette date ?
    0
  2. ami2284 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    before_one_days veut dire la date systéme-1 ça veut dire la date d'hier.
    je pense que le problème vint de l’écriture de la variable dans la requête
    0
    1. trifou
       
      Dans ce cas affiche la valeur du select sql de ta requête, c'est quand même la 1ère chose à vérifier, print est l'outil de débogage numéro 1 de python (et pas que).
      0
  3. ami2284 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    quand je met SELECT * FROM datafwi where datefwi='2020-01-01'c'est bon
    mais quand je mets la variable:
    Voici ce que ça donne comme erreur
    Error while fetching data from PostgreSQL ERREUR: syntaxe en entrée invalide pour le type date : « +before_one_days + »
    LINE 1: SELECT * FROM datafwi where datefwi='+before_one_days +'
    0
    1. trifou
       
      Et donc que vaut le sql ?

      print("SELECT * FROM datafwi where datefwi='+before_one_days +'")


      En plus, on ne fait pas de concaténation pour insérer des valeurs dans une requête, mais on utilise les options fournies par le module qui se chargera de sécuriser le tout.
      0
  4. ami2284 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    j'écris comment la requête

    cursor.execute("SELECT * FROM datafwi where datefwi='+before_one_days +'")???
    0
    1. trifou
       
      Désolé, j'abandonne, je vais pas te demander 50 fois ce que vaut un print de ton select, parce que le problème est là ! Ta variable before_one_days ne vaut pas ce que tu penses.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ami2284 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    ok je suis desolée voici ce que ça donne leprint("SELECT * FROM datafwi where datefwi='+before_one_days +'")

    Error while fetching data from PostgreSQL ERREUR: la colonne « before_one_days » n'existe pas
    LINE 1: SELECT * FROM datafwi where datefwi=before_one_days
    0
    1. trifou
       
      Bonjour,

      J'ai essayé au maximum de te faire comprendre ce qu'il se passe, mais manifestement tu as du mal ^^

      Pourtant tu vois bien que ton sql n'est pas bon.

      LINE 1: SELECT * FROM datafwi where datefwi=before_one_days


      Cela signifie que postgresql cherche à tester une égalité entre ta colonne datefwi et une colonne before_one_days qui n'existe pas dans ta table.
      On peut donc conclure que ta concaténation n'est pas bonne.
      Alors on corrige.

      cursor.execute("SELECT * FROM datafwi where datefwi='" +before_one_days + "'")


      Et pour éviter ce genre de désagrément, on préfère utiliser format.

      cursor.execute("SELECT * FROM datafwi where datefwi='{}'".format(before_one_days))


      Mais comme je t'ai signalé, execute peut prendre des valeurs à passer à la requête, il est plus que préférable d'utiliser cela.

      http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

      Qui donnerait donc pour toi.

      cursor.execute("SELECT * FROM datafwi where datefwi=%", (before_one_days,))


      Cette syntaxe est à privilégier absolument.
      0
  7. ami2284 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci beaucoup ça a marché , desolée encore une fois.
    0