Requete sql contenant une variable date

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. 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 ?
    1. 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
      1. 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).
    2. 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 +'
      1. 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.
    3. j'écris comment la requête

      cursor.execute("SELECT * FROM datafwi where datefwi='+before_one_days +'")???
      1. 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.
    4. 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
      1. 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.