Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Insérer un array dans une BDD

Insérer un array dans une BDD

Remonter à Forum général Python
  • Insérer un array dans une BDD

    Envoyé par mamatlecaribou le 7 Juin 2005 à 15:13
    Bonjour,

    Je souhaute insérer un vecteur ou une matrice dans ma base Postgresql depuis python.
    J'utilise pour cela les modules Numeric et psycopg.

    J'arrive bien à insérer une matrice "à la main" par les commandes :

    c.execute("INSERT INTO mymatrix VALUES (5,'{{1,2,3},{1,2,3}}')")


    mais je n'arrive pas à insérer une matrice créé par :

    b=zeros((50,50),Int)



    Quelqu'un connait-il la commande pour réaliser cela ?

    NB : Ma table comporte deux champs : un entier et un array.
    Merci.
    • Re: Insérer un array dans une BDD

      Envoyé par tarek le 8 Juin 2005 à 08:08
      tu a essayé de transformer b en liste python classique ?

      (méthode aslist() )
    • Re: Insérer un array dans une BDD

      Envoyé par mamatlecaribou le 8 Juin 2005 à 09:37
      Merci Tarek,

      Je n'ai pas trouvé la fonction aslist(), mais tolist() qui transforme mon array en liste.

      Mais lorsque j'essaye de l'insérer dans ma base ça ne fonctionne pas .


      b=zeros((50,50),Int)
      c=b.tolist()

      print type(c)

      cur.execute("INSERT INTO mymatrix VALUES (4 ,'c')")
      connex.commit()


      me renvoie :

      [em]

      Traceback (most recent call last):
      File "ArrayBdd.py", line 15, in ?
      cur.execute("INSERT INTO mymatrix VALUES (4 ,'c')")
      psycopg.ProgrammingError: ERROR: array value must start with "{" or dimension i
      nformation

      INSERT INTO mymatrix VALUES (4 ,'c')[/em]

      Je pense que je ne passe pas ce qu'il faut comme deuxième argument de VALUES, mais je ne vois vraiment pas comment faire autrement.

      Merci
    • Re: Insérer un array dans une BDD

      Envoyé par tarek le 8 Juin 2005 à 10:02
      Ok, je suis allé trop vite,
      en fait tu dois transformer ta liste ou ton array en chaine de caractère avec des { }:


      tableau = ['{']**
      y = 1**
      for line in liste:**
      tableau.append('{')**
      i = 1**
      for element in line:**
      tableau.append(str(element)) # transtypage à vérifier**
      if i < len(line):**
      tableau.append(', ')**
      i += 1**
      tableau.append('}')**
      if y < len(liste):**
      tableau.append(', ')**
      y += 1**
      **
      tableau.append('}')**
      **
      resultat = ''.join(tableau)**
      **
      cur.execute("INSERT INTO mymatrix VALUES (4 , %s)" % resultat)**


      le rendu par code est pété :(

      ** == saut de ligne

      à controler j'ai pas testé, et puis on peut surement mieux faire c'est un peu brutal
    • Re: Insérer un array dans une BDD

      Envoyé par mamatlecaribou le 8 Juin 2005 à 10:34
      Il n'y a rien de plus simple ?
      Parce que si il faut que je fasse ce genre de manipulation à chaque fois, ca risque d'allourdir pas mal le code et de prendre du temps ...
      Il est impossible d'insérer le type array dans une BDD !

    • Re: Insérer un array dans une BDD

      Envoyé par tarek le 8 Juin 2005 à 10:40
      plus simple ? surement que si, mais bon ton code envoie une requete sous forme de string..

      regarde dans la doc de psycopg pour faire de requetes paramétrables
      c'est forcément possible (j'ai jamais fait donc je peux pas te montrer)


    • Re: Insérer un array dans une BDD

      Envoyé par mamatlecaribou le 8 Juin 2005 à 10:56
      Je ne comprend pas ce que tu veux dire. Je ne veux pas envoyer une requete sous forme de string, je veux juste pouvoir passer un vecteur dans ma bdd. Le type dans la base de données est un int[], et je voudrais pouvoir insérer un vecteur depuis mon script python.

      En ce qui concerne la doc psycopg, je n'ai quasiment rien trouvé si ce n'est des exemples :
      http://cip.physik.uni-freiburg.de/cgi-bin/dwww?type=file&location;=/usr/share/doc/python2.2-psycopg/doc/examples
    • Re: Insérer un array dans une BDD

      Envoyé par tarek le 8 Juin 2005 à 11:13
      ce que je veux dire c'est que cette ligne:

      cur.execute("INSERT INTO mymatrix VALUES (4 ,'c')")

      envoie une chaine de caractère à execute.

      En Bdd, lorsque des paramètres comme c sont récupérés programmatiquement, il est d'usage d'utiliser une requête paramétrée genre :

      cur.query = "INSERT INTO mymatrix VALUES (4 ,:mon_param)"

      puis de remplacer à l'execution :mon_param par le tableau
      genre:

      cur[mon_param] = mon_tableau
      cur.execute()

      (j'ecris pas ce qui est juste, c'est simplement un exemple valable pour tout systeme bd)

      si j'ai du temps ce soir je regarderais la syntaxe exacte et ferais un mini-tuto.




    • Re: Insérer un array dans une BDD

      Envoyé par mamatlecaribou le 9 Juin 2005 à 07:31
      OK, merci. Ca m'interesse bien ce petit tuto.
      Peut-être as tu aussi des liens utiles à ma conseiller ?
    • Re: Insérer un array dans une BDD

      Envoyé par mamatlecaribou le 14 Juin 2005 à 09:25
      Salut Tarek, je me demandais si tu avais eu le temps de regarder à mon problème ...???

      Merci
Rendu par Ploneboard