Probleme de variable Python/SQL sur ArcGIS

Fermé
Mr_cham - 1 juin 2012 à 05:27
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 1 juin 2012 à 08:55
Bonjour,

Bonjour,

Je suis debutant en informatique, bien qu'ayant recu une formation d'ingenieur a ce sujet qui m'a fourni les bases de la programation sur pike(C), php et SQL, je me suis dernierement mis a python pour utiliser ArcGIS, un logiciel Systeme d'Information Geographique.

La derniere version contient un shell python integrer, pour lequel j'ecris mon programe. Je dois selectionner des donnees dans des tables, et ArcGIS utilise des requetes SQL pour ce, avec une fenetre d'aide de construction de requetes de type SELECT. La requete python est de ce type :
arcpy.TableSelect_analysis("HOUSING"," new.dbf",'"TRACT"= 101110'), le dernier attribut de la ligne etant la requete SQL. Ca, ca marche

Lorsque j'essaie de lancer le nom de la ligne stockee dans une variable python ( int, mais qui peut etre str ou autre pour l'instant), python me dis qu'il ne connais pas cette variable:
arcpy.TableSelect_analysis("HOUSING"," new.dbf",'"TRACT"= i')
Runtime error <class 'arcgisscripting.ExecuteError'>: ERROR 999999: Error executing function. A column was specified that does not exist. A column was specified that does not exist. Failed to execute (TableSelect).

J'ai essayer de definir autrement ma variable, en global, avec une syntaxe de SQL (j'en ai essayer plusieurs), rien ne marche, la variable de python ne prend pas dans SQL

Est que quelqu'un auraient une idee?

Desole pour les fautes, j'ecris comme vous avez pu le deviner avec un qwerty..

Merci d'avance !

Mr_cham

2 réponses

Utilisateur anonyme
1 juin 2012 à 08:23
Bonjour

Je ne connais pas spécialement python, mais il est clair que quand tu écris '"TRACT"= i', le i est un simple caractère dans une chaine littérale(constante) et pas une variable. Il faut que tu crées une chaîne qui contienne la valeur de i, ce qui se fait en concaténant la partie constante de la chaine avec la valeur de la variable :
'"TRACT"= ' + i

Si de plus, comme je le suppose, TRACT est le nom d'un champ, vérifie s'il faut bien des " autour du nom de champ (ça dépend des variantes de SQL). Avec mysql, il n'en faudrait pas :
'TRACT= ' + i
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 1/06/2012 à 08:59
Bonjour,

Quelle version de Python utilises-tu ?
Avec Python 2.7, la tentative d'utiliser un objet qui n'existe pas donne le message d'erreur suivant:
NameError: name 'x' is not defined

Je ne crois pas que ton problème soit celui de l'inexistence d'un identifiant dans le code Python, mais plutôt de valeur de i qui doit être plus grande que le nombre de colonnes de la base de données.
Pour savoir à quoi t'en tenir , place simplement l'instruction
print i
avant la ligne qui déclenche l'erreur.


--------------------------

D'autre part, tu remarqueras qu'il n'y a pas le mot 'variable' ci-dessus. C'est un mot à proscrire en Python car il est casse-gueule.
Il n'y a pas de variable en Python au sens de "morceau de mémoire dont la valeur peut changer"
Ainsi ton expression "le nom de la ligne stockee dans une variable python " est une horreur en Python.
A la base, en Python, il n'y a que des objets dont la valeur de chacun est fixe une fois créés (ils sont immutables).
A un tel objet est attaché un nom dont la meilleure appellation est 'identifiant'.
Quant à sa nature, ce nom est comme une étiquette, il peut être collé sur un objet, en être décollé pour le coller sur un autre objet, mais en aucun cas la valeur d'un morceau de mémoire repéré par un nom donné ne change au cours de l'exécution d'un code Python.
Les autres langages procèdent en changeant les valeurs "dans" des variables, Python procède à une création d'objets et d'étiquettes qui valsent d'un objet à un autre. Quand un objet n'a plus d'étiquette, il est mort aux yeux du programme, le gestionnaire de mémoire récupère la place mémoire qu'il occupait.
Ainsi quand on écrit
a = 10 
b = a
on ne crée pas deux emplacements mémoire ayant tous deux la même valeur 10, il se passe en fait:
- création d'un objet de valeur 10
- l'identifiant a est associé à cet objet
- un deuxième identifiant b est associé à l'objet que repère a
- résultat: un seul objet en mémoire, avec deux identifiants qui repèrent le même objet.
Si on écrit ensuite
a = 'kilo' 
, l'identifiant a est détaché de l'objet 'entier 10' et collé sur l'objet chaîne nouvellement créé, l'objet 'entier 10' restant en vie parce qu'il y a toujopurs l'identifiant b qui lui est associé.

En réalité, de façon sous-jacente, il y a un ballet de pointeurs. Les objets dits mutables en Python sont en réalité des collections de pointeurs vers les objets de base qui sont immutables.

Le seul usage acceptable du mot 'variable' en Python est celui de synonyme du mot 'nom' ou 'identifiant'. Mais comme l'ambiguïté avec le sens de "morceau de mémoire de valeur variable" existe, il vaut mieux éviter de l'employer, il perturbe la bonne compréhension de ce qui se passe vraiment.
Par exemple, quand on conçoit les identifiants comme désignant des morceaux de mémoire variable, on ne comprend pas le résultat du code suivant
li = [1,2,3,4,5] 
la = li 
la[2] = 100 
print li 
print la
qui produit
[1,2,100,4,5] 
[1,2,100,4,5]
0