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.
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 '? –
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. –
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