Vous n'êtes pas identifié(e).

#1 01/10/2014 13:57:46

Rêquete sql (postgis) via phyton

Bonjour,

Je travail sur postgresql 9.3 et python 2.7.
J'ai une application/interface en python qui insert des données dans ma base de données via un fichier excel et d'autres informations directement donnés par l'utilisateur, en particulier un code 'srid'.

Je travail sur la création de points (x,y,z) via postgis. Les colonnes où les points sont créé sont de ce type : geometry('POINT',srid). Le srid est un chiffre spécifique à la colonne et référe à un système de coordonnée. Pour faire simple j'ai besoin d'une table par srid.

j'auto génère mes tables de types geometry comme ceci :


Code :

Sélectionner tout - Visualiser dans une fenêtre à part

 CREATE OR REPLACE FUNCTION add_colsrid()
  RETURNS void AS
$BODY$
    DECLARE 
          srid integer;
          requete text;
    BEGIN
        SELECT srid_py INTO srid FROM srid WHERE NOT EXISTS ( SELECT * FROM project WHERE project.proj_srid = srid.srid_py) ;
        RAISE notice 'verif (%)', srid ;
        IF srid IS NOT NULL THEN
              requete := 'ALTER TABLE point ADD COLUMN' || srid || ' geometry;';
          EXECUTE requete;
        END IF;
    END;
  $BODY$
  LANGUAGE plpgsql VOLATILE  

Pour résultat j'ai une nouvelle colonne dans ma table point qui porte le nom columnXXX où XXX est le code srid (srid ='1420' alors le nom de la colonne est colunm1420).
Le soucie est que la colonne est au format geometry et non geometry('POINT',srid). Je ne peut pas préciser le srid directement dans ce code car il est de type varchar pour pouvoir créer le nom de la colonne et que dans geometry('POINT',srid) il est de type int.

Je doit donc modifier le type de la colonne en précisant le srid à utiliser. j'ai eu l'idée de passer par mon interface python pour cela. J'ai essayé :


Code :

"ALTER TABLE point ALTER COLUMN column||%s|| TYPE geometry('POINT',SELECT srid_conv FROM srid WHERE srid_projnum = %s)USING column||%s||::geometry")%(srid,projNum,srid)

Explication :
srid est de type varchar et est directement fourni par le code python. column||%s|| est sencé donnée colunm120 par exemple si le srid ='120'.
SELECT srid_int FROM srid WHERE srid_projnum = %s est sencée retournée le srid en chiffre, qui est stockée dans la base de donnée dans le champ srid_int de la table srid.

Le problème est que cette syntaxe ne fonctionne pas et que je n'ai qucune idée de ce qui pourrait fonctionner. Je débute dans les deux languages, j'ai donc des soucies de syntaxe et aussi d'optimisation du code. Je prend toute remarque pour optimiser mon code car il est relativement complexe pour le moment et je pense qu'il y a des choses plus stables et plus simple qui existe.

Merci d'avance

Hors ligne

Pied de page des forums