Wie erstelle ich ein JSON in SQLAlchemy?

Django, Flask, Bottle, WSGI, CGI…
Antworten
moehre
User
Beiträge: 39
Registriert: Donnerstag 21. April 2016, 13:50

Oh ok geht das wirklich so einfach?

Wenn ich dein Code ausprobiere kommt folgende Fehlermeldung:
ORA-21500: Interner Fehlercode, Argumente: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]

Nur wenn ich die Geometrie weglasse funktioniert es wieder.

In der Python Konsole:
>>> geometry.SDO_ORDINATES
<cx_Oracle.Object MDSYS.SDO_ORDINATE_ARRAY at 0x2533de8>

>>> geometry.SDO_ORDINATES.aslist()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
cx_Oracle.DatabaseError: OCI-21500: Interner Fehlercode, Argumente: [19708], [],
[], [], [], [], [], []
OCI-21500: Interner Fehlercode, Argumente: [kope2upic2954], [54], [155], [0], []
, [], [], []
OCI-21500: Interner Fehlercode, Argumente: [19708], [], [], [], [], [], [], []

Was bedeutet das???
moehre
User
Beiträge: 39
Registriert: Donnerstag 21. April 2016, 13:50

Ok ich weiß jetzt wo der Fehler liegt!
In der cx_Oracle Doku steht, dass das Cursor Object eine default Größe von 50 (cursor.arraysize) besitzt!
Das heißt er greift nur 50 Reihen von der Abfrage ab und überträgt sie zum Client.
Wenn ich die arraysize vom Cursor erhöhe werden alle Ergebnisse dargestellt.

Dieser Internal Server Error bezieht sich somit auf die Cursor.arraysize!

Code: Alles auswählen

class grid:
	def GET(self):	
		web.header('Access-Control-Allow-Origin',      '*')
		web.header('Access-Control-Allow-Credentials', 'true')		
		web.header('Content-Type', 'application/json')
		
		
		cursor = connection.cursor()
		cursor.arraysize = 5000 # default = 50
		cursor.execute("""SELECT a.id , c.geometry, d.Classname FROM   building a, THEMATIC_SURFACE b, SURFACE_GEOMETRY c, OBJECTCLASS d  WHERE  a.grid_id_400 = 4148 AND a.id = b.BUILDING_ID AND b.LOD2_MULTI_SURFACE_ID = c.ROOT_ID AND c.GEOMETRY IS NOT NULL AND b.OBJECTCLASS_ID = d.ID""")
		
		
		result = []
		for id, geometry, classname in cursor:
			result.append({
			"building_nr": id, "geometry": {
				"type": "polygon",
				"coordinates": geometry.SDO_ORDINATES.aslist(),
				}, "polygon_typ": classname,
			})
		return json.dumps(result)
Wenn ich alternativ diesen code verwenden will kommt bei Geometrie null raus. Wisst ihr vielleicht wieso?:

Code: Alles auswählen

def GeometryObj(obj):
	coordinates = []
	sourceCoordinates = obj.SDO_ORDINATES.aslist()
	
	for i in range(len(sourceCoordinates) // 3):
		coordinates.append(sourceCoordinates[i * 3:i * 3 + 3])
	return

Code: Alles auswählen

		result = []
		for id, geometry, classname in cursor:
			result.append({
			"building_nr": id, "geometry": {
				"type": "polygon",
				"coordinates": GeometryObj(geometry),
				}, "polygon_typ": classname,
			})
		return json.dumps(result)
moehre
User
Beiträge: 39
Registriert: Donnerstag 21. April 2016, 13:50

Ahh ich habe vergessen beim return coordinates anzugeben!
So jetzt funktioniert es optimal....:)

Output:
[{"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496994.34, 5394340.43, 440.82500000000005], [3496994.18, 5394336.51, 440.92], [3496998.89, 5394336.19, 440.68800000000005], [3496999.1, 5394339.13, 440.612], [3496997.82, 5394339.22, 440.675], [3496997.89, 5394340.19, 440.65000000000003], [3496994.34, 5394340.43, 440.82500000000005]]}, "polygon_typ": "BuildingRoofSurface"},
{"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496999.1, 5394339.13, 440.612], [3496998.89, 5394336.19, 440.68800000000005], [3496998.89, 5394336.19, 438.27], [3496999.1, 5394339.13, 438.27], [3496999.1, 5394339.13, 440.612]]}, "polygon_typ": "BuildingWallSurface"}, {"building_nr": 936948, "geometry": {"type": "polygon", "coordinates": [[3496997.82, 5394339.22, 440.675], [3496999.1, 5394339.13, 440.612], [3496999.1, 5394339.13, 438.27], [3496997.82, 5394339.22, 438.27], [3496997.82, 5394339.22, 440.675]]}, "polygon_typ": "BuildingWallSurface"}]
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@moehre: schau mal Dein "return" an.

Code: Alles auswählen

def geometry_to_points(obj):
    return zip(*[iter(obj.SDO_ORDINATES.aslist())]*3)
moehre
User
Beiträge: 39
Registriert: Donnerstag 21. April 2016, 13:50

Alles klar danke ;)
Antworten