2012-06-29 14 views
5

Aquí está la historia.mapping psql type oids a python types - with psycopg2

Tengo un montón de procedimientos almacenados y todos tienen sus propios tipos de argumentos.
Lo que estoy buscando hacer es crear un poco de una capa de seguridad de tipo en python para poder asegurarme de que todos los valores sean del tipo correcto antes de acceder a la base de datos.

Por supuesto, no quiero volver a escribir todo el esquema en python, así que pensé que podría generar automáticamente esta información en el arranque obteniendo los nombres y tipos de argumentos de la base de datos.

Así que proceder a cortar hasta esta consulta sólo para las pruebas

SELECT proname, proargnames, proargtypes 
FROM pg_catalog.pg_namespace n 
JOIN pg_catalog.pg_proc p 
ON pronamespace = n.oid 
WHERE nspname = 'public'; 

Luego ejecutar desde Python y para 'proargtypes' que consiguen una cadena como esta para cada resultado

'1043 23 1043' 

Mi El ojo agudo me dice que estos son los oidos para los tipos postgresql, separados por espacio, y esta cadena particular significa que la función acepta varchar, integer, varchar. Así que en jerga pitón, esto debería ser

(unicode, int, unicode) 

Ahora, ¿cómo puedo obtener los tipos de pitón de estos números?

El resultado final ideal sería algo como esto

In [129]: get_python_type(23) 
Out[129]: int 

He mirado a lo largo de psycopg2 y el más cercano que he encontrado es extensions.string_types '', pero que acaba de mapas oids a nombres de tipo SQL.

Respuesta

1

El mapeo de tipos de postgres y tipos de pitón se da here. ¿Eso ayuda?

Edit: Cuando lee un registro de una tabla, el controlador postgres (o cualquier base de datos) correlacionará automáticamente los tipos de columna de registro con los tipos de Python.

cur = con.cursor() 
cur.execute("SELECT * FROM Writers") 

row = cur.fetchone() 

for index, val in enumerate(row): 
    print "column {0} value {1} of type {2}".format(index, val, type(val)) 

Ahora, solo tiene que asignar tipos de Python a tipos de MySQL mientras escribe el código de la interfaz de MySQL. Pero, francamente, esta es una forma indirecta de mapear tipos de tipos de PostgreSQL a tipos de MySQL. Me limitaría a referirme a una de las numerosas asignaciones de tipos entre estas dos bases de datos como this

+1

Estoy viendo cómo registrar nuevos tipos y cómo convertir valores de tipos de python a sql y whatnot, pero ¿dónde está exactamente el código que dice ' 23 se convierte en int 'o' 1043 se convierte en str '? –

+0

Su edición funcionará EXCEPTO cuando cualquiera de las columnas tenga un valor nulo, entonces el tipo simplemente se convertirá en Ninguno y todo se perderá. Además, estos procedimientos son solo para escribir y sus argumentos no se asignan directamente a las vistas correspondientes. Sin embargo, encontré el método 'cursor.cast', que es algo con lo que podría trabajar. –

+4

También tengo esta pregunta, pero la edición no funcionará porque no hay garantía de recuperar una realmente devolviendo algo (por ejemplo, si no hay registros en la base de datos). Incluso en ese caso, sin embargo, aún puedo obtener los OID de tipo de columna llamando a cursor.description, pero quiero saber a qué tipos de Python se los traduce. Obviamente, la información está disponible en alguna parte, porque psycopg hace la conversión, la pregunta es cómo acceder a esta información. – ibrewster