Comment faire pour qu'un utilisateur de mon programme puisse voir des informations en entrant le nom d'une table de données?

a marqué ce sujet comme résolu.

Bonjour ou bonsoir à toutes et tous,

J’ai besoin d’aide pour un exercice noté que je dois faire en python/sql (je suis débutante). Voici l’énoncé :

Exercice :

Ecrire un programme Python présentant le bilan en fonction des informations données par l’utilisateur. Par exemple, si les utilisateurs veulent le bilan concernant la vente de chaque mois ci-dessus, ils peuvent préciser les informations comme la table ‘time’ et l’attribut ‘month’ à l’entrée du programme et le programme retourne le résultat comme la suite :

Unités vendues de month ( 1 ) est 2233 Unités vendues de month ( 2 ) est 1712 Unités vendues de month ( 3 ) est 1972 Unités vendues de month ( 4 ) est 2230 Unités vendues de month ( 5 ) est 2250 Unités vendues de month ( 6 ) est 2108

Si les utilisateurs donnent les informations comme ‘geo’ et ‘dept’, le programme retourne le bilan concernant le vente de chaque département comme :

Unités vendues de dept ( 38 ) est 3008 Unités vendues de dept ( 69 ) est 2988 Unités vendues de dept ( 75 ) est 3482 Unités vendues de dept ( 95 ) est 3027

Et voici mon programme :

import psycopg2

try : 
     connection = psycopg2.connect(user = "etudiant",password = "*",host ="localhost",database = "db2020etudiant")
     cursor = connection.cursor()

     choix = int(input("Que souhaitez-vous visualiser ? : \n\t 1-Le bilan par mois (time/month) \n\t 2-Le bilan par département (geo/dept) \n Veuillez saisir votre choix (time, month, geo ou dept). \n"))

     If choix == 1 : 
          requete = "SELECT sales, SUM(units) from sales, time WHERE sales.time_id = time.time_id GROUP BY month ORDER by month"
          cursor.execute(requete)
          records = cursor.fetchall()
          for row in records : 
               print ("Unités vendues par mois", row[0], "est", row[1])

     If choix == 2 : 
          requete = "SELECT dept, SUM(units) from geo, sales WHERE geo.geo_id = time.time_id GROUP BY dept ORDER by dept"
          cursor.execute(requete)
          records = cursor.fetchall()
          for row in records : 
               print ("Unités vendues par département", row[0], "est", row[1])

except (Exception, psycopg2.Error) as error : 
     print ("Error while fetching data from PostgreSQL", error)

finally : 
     if(connection): 
          cursor.close()
          connection.close()
          print("PostgreSQL connection is closed")

Le problème c’est que je ne sais pas comment faire pour que lorsque l’utilisateur tape "time", "month", "geo" ou "dept" le choix 1 ou 2 s’affiche respectivement.

Mon professeur nous a donné cet exemple (avec tablename) comme point de départ :

import psycopg2

tablename = input("Donner le nom de table :")

try : 
     connection = psycopg2.connect(user = "etudiant",password = "A135792468*",host ="localhost",database = "db2020etudiant")
     cursor = connection.cursor()
     Query = "SELECT * FROM " + tablename

Sauf que voilà, je ne vois pas comment je pourrais faire pour intégrer cela à mon programme. J’espère avoir été claire. Merci pour votre aide !

+0 -0

salut ^^

même si c’est pas grave aujourd’hui car ton mot de passe est lambda, oublie jamais de ne pas le laisser traîner sur des forums ou d’autre site internet (ça arrive souvent sur github malheureusement)

on ignore a quoi ressemble ta base de données, avec ce que tu me dis

les utilisateurs doivent pouvoir rentrer plusieurs possibilité comme

  • time month
  • time year
  • time day
  • geo dept
  • geo country

ou ils sont limité au 2 choix que le prof a donné ?

pour ensuite le retourne de maniere propre

Unités vendues de month ( 1 ) est 2233
Unités vendues de month ( 2 ) est 1712
Unités vendues de month ( 3 ) est 1972
Unités vendues de month ( 4 ) est 2230
Unités vendues de month ( 5 ) est 2250
Unités vendues de month ( 6 ) est 2108
....

OU 

Unités vendues de dept ( 38 ) est 3008
Unités vendues de dept ( 69 ) est 2988
Unités vendues de dept ( 75 ) est 3482
Unités vendues de dept ( 95 ) est 3027
....

ton programme est parfait (si il marche évidemment :p même si le WHERE geo.geo_id = time.time_id dans la 2nd requêtes me fait douté ) et si l’utilisateur n’as que les 2 possibilités.

toutefois j’ai plus l’impression que ce que le prof demandes c’est la premiere possibilité, c’est a dire "pouvoir saisir de manière dynamique le group by

autrement dit avoir une gestion dynamique de la requête (c’est l’exemple qu’il a donnée)

SELECT sales, SUM(units) from sales, time WHERE sales.time_id = time.time_id GROUP BY month ORDER by month

SELECT dept , SUM(units) from sales, geo  WHERE sales.geo_id  = geo.dept_id  GROUP BY dept  ORDER by dept

si je te mets l’un a coté de l’autre les 2 requetes, ne voit tu pas un schema ce dessiner (par schema j’entend une ressemblance) ?

cordialement

Bonsoir !

Merci beaucoup pour ta réponse rapide ! Grâce à ton message j’ai réussi à écrire ce programme qui malheureusement ne fonctionne pas. J’ai une "Invalid syntax" à la requete_1 mais je ne vois pas où, j’ai tout essayé. Serait-il possible que tu me corriges ? Merci infiniement

import psycopg2

tablename = input ("Donner le nom de la table : ")
colonne = intput ("Quel est le nom de la colonne ?")

try : 
     connection = psycopg2.connect(user = "etudiant",password = "*",host ="localhost",database = "db2020etudiant")
     cursor = connection.cursor()
     requete_1 = "select month, sum(units) from sales," +tablename+ "where sales.time_id" = +tablename+ ".time_id group by" +colonne+ "order by" +colonne+
     requete_2 = "select dept, sum(units) from sales," +tablename+ "where sales.time_id" = +tablename+ ".time_id group by" +colonne+ "order by" +colonne+
      
      
      cursor.execute(requete_1)
      cursor.execute(requete_2)
      print("Selecting rowws from mobile table using cursor.fetcall")
      records = cursor.fetchall()
      
      print("Print each row and it's columns values")
      for row in records : 
             print("Valeurs unités de" +colonne+, row[0], "est", row[1])
          
except (Exception, psycopg2.Error) as error : 
     print ("Error while fetching data from PostgreSQL", error)

finally : 
     if(connection): 
          cursor.close()
          connection.close()
          print("PostgreSQL connection is closed")
+0 -0

pas de problèmes

requete_1 = "select month, sum(units) from sales," +tablename+ "where sales.time_id" =+tablename+ ".time_id group by" +colonne+ "order by" +colonne+
 
requete_1 = "select month, sum(units) from sales, " +tablename+ " where sales.time_id = " +tablename+ ".time_id group by " +colonne+ " order by " +colonne

la 2nd est ta requêtes corrigé je te laisse voir le problème ^^

par contre tu as le même probleme sur ta 2nd requêtes la ligne 20 est bizarre

+1 -0

Je dirais que ça va aussi manquer d’espaces autour du nom de la table. Ce serait sûrement plus simple à exprimer avec des f-strings.

f'SELECT month, sum(units) FROM sales, {tablename} WHERE ...'

Ou à voir si tu peux utiliser une requête SQL paramétrée, mais je crois pas que ce soit possible pour le nom de la table.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte