Suite

La lecture des données Oracle avec PyQGIS donne l'erreur « l'identifiant n'est pas long »


Avez-vous une idée de la façon de charger les données spatiales Oracle sur QGIS à l'aide de PyQGIS ? C'est possible? J'essaie:

uri = QgsDataSourceURI() uri.setConnection("*host*", "1521", "*database*", "*username*", "*password*") sql = "(SELECT fid, geom FROM target.ms_ft_bh095_v) " uri.setDataSource("",sql,"GEOM","","fid") layer = QgsVectorLayer(uri.uri(), "test", "oracle")

Le message d'erreur est : ORA-00972 : l'identifiant n'est pas long. Mais la valeur maximale du FID est d'environ 20 000. Le pilote Oracle est-il correct avec cette syntaxe ? Ms_ft_bh095_v est vue en ce moment.


Le message d'erreur réel est "ORA-00972 : l'identifiant est trop long". Cela n'a rien à voir avec la taille ou la valeur maximale d'une colonne, mais plutôt qu'un identifiant tel qu'un nom de table ou un nom de colonne est trop long (plus de 30 caractères).

Cela dit, je ne vois rien de mal avec l'instruction SELECT que vous utilisez - à moins que l'interface que vous utilisez n'ajoute quelque chose pour la rendre invalide. Ou votre définition de vue contient quelque chose de bizarre. Ou votre définition de table a quelque chose de bizarre.


Le code ci-dessous a fonctionné pour moi.

# Importer les modules système de xml.dom.minidom importer Document importer la chaîne importer os importer sys de qgis.core importer * de qgis.gui importer * de PyQt4.QtCore importer * de PyQt4.QtGui importer QApplication de PyQt4.QtXml importer * de ctypes import* import cx_Oracle strProjetName = "C:/OSGeo4W/apache/htdocs/QGIS-Web-Client-master/projects/myworld.qgs" if os.path.isfile(strProjetName): os.remove(strProjetName) def add_LayersFromDB() : QGISAPP = QgsApplication(sys.argv, True) QgsApplication.setPrefixPath(r"C:OSGeo4Wappsqgis", True) QgsApplication.initQgis() #Connect to Oracle and Fetch Table Names con = cx_Oracle.connect('testinstance /[email protected]:1521/new') print con.version cur = con.cursor() cur.execute(u"select TABLE_NAME from user_tab_columns where data_type="SDO_GEOMETRY"") tables = cur.fetchall() QgsProject. instance().setFileName(strProjetName) print QgsProject.instance().fileName() render = QgsMapRenderer() uri = QgsDataSourceURI() uri.setConnection("189.60.67. 146", "1521", "new", "testinstance", "testinstance") render = QgsMapRenderer() pour t dans les tables : print str(t[0]) uri.setDataSource(", str(t[0]) , "GEOMÉTRIE") uri.uri() vlayer = QgsVectorLayer(uri.uri(),str(t[0]), 'oracle') QgsMapLayerRegistry.instance().addMapLayer(vlayer) lst = [ vlayer.id() ] render.setLayerSet(lst) rect = QgsRectangle(render.fullExtent()) rect.scale(1.1) render.setExtent(rect) QgsProject.instance().write() cur.close() con.close() QgsApplication. exitQgis() add_LayersFromDB()


Voir la vidéo: qgis python - QGIS Python Console. Introduction to PYQGIS (Octobre 2021).